Using scale = "row"
will scale your data by row and doesn't keep your original, raw values so you should use scale = "none"
if you want to preserve those.
You can set breaks manually by using the breaks
argument. In this case, I think you could achieve what you're looking for by creating a sequence from -3 to 3, and setting length.out
to one more than the number of colours you've defined (there needs to be 1 more breaks than colours):
heatmap.2(hmdat[select,],scale="none", col = hmcol, trace="none", margin=c(7, 5),cexCol=0.9,cexRow=0.5,density.info="density",breaks = seq(-3, 3, length.out = 101))
You might get warnings about there being no data for some values, and you may need to add symbreaks = TRUE
to get the symmetrical effect you're looking for.
I don't think there is a simple option to change the labels of the color key, but you can try the solution in this question: How to change the color key value in heatmap.2?