Here is another possibility using scale_colour_gradientn . The colours display is set using values = rescale(...) , so the resolution is higher for values close to zero. I looked at some color scales here: http://colorbrewer2.org . I chose a diverging color scheme with 5 classes, RdBu, from red-blue to almost white. There may be other scales that best suit your needs, it's 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 matches the blue # 0571B0; -1 = cyan # 92C5DE; 0 = light gray # F7F7F7; 1 = light red # F4A582; 10 = red # CA0020. Values between -1 and 1 are interpolated between light blue and light red, etc. Thus, the display is not linear, and the resolution for small values is higher.
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())

source share