Increase resolution of color scale for values close to zero

Here is another possibility, using scale_colour_gradientn. Mapping of colours is set using values = rescale(...) so that resolution is higher for values close to zero. I had a look at some colour scales here: http://colorbrewer2.org. I chose a 5-class diverging colour scheme, RdBu, from red to blue via near-white. There might be other scales that suit your needs better, this is just to show the basic principles.

# check the colours
library(RColorBrewer)
# cols <- brewer_pal(pal = "RdBu")(5) # not valid in 1.1-2
cols <- brewer.pal(n = 5, name = "RdBu") 
cols
# [1] "#CA0020" "#F4A582" "#F7F7F7" "#92C5DE" "#0571B0"
# show_col(cols) # not valid in 1.1-2
display.brewer.pal(n = 5, name = "RdBu")

Using rescale, -10 corresponds to blue #0571B0; -1 = light blue #92C5DE; 0 = light grey #F7F7F7; 1 = light red #F4A582; 10 = red #CA0020. Values between -1 and 1 are interpolated between light blue and light red, et c. Thus, mapping is not linear and resolution is higher for small values.

library(ggplot2)
library(scales) # needed for rescale
ggplot(rtn.data) +
  geom_segment(aes(x = x, xend = x, y = 0, yend = yend, colour = yend)) +
  xlab("") + ylab("S&P 500 Daily Return %") +
  scale_colour_gradientn(colours = cols, 
                         values = rescale(c(-10, -1, 0, 1, 10)),
                         guide = "colorbar", limits=c(-10, 10)) +
  theme(legend.position = "null", axis.title.x = element_blank())

enter image description here

Leave a Comment