Variação de valor pequeno invisível usando scale_colour_gradient2

Eu gostaria de fazer pequenos retornos nesta plot mais visíveis. A function mais apropriada parece ser scale_colour_gradient2 , mas isso scale_colour_gradient2 os pequenos retornos, que acontecem com mais frequência. Usar os limits ajudou, mas não consegui descobrir como definir oob (fora dos limites) para que ele tivesse apenas um valor “saturado” em vez de ficar cinza. E a transformação de log apenas fez com que pequenos valores se destacassem. Alguém mais descobriu como fazer isso com elegância?

 library(zoo) library(ggplot2) library(tseries) spx <- get.hist.quote(instrument="^gspc", start="2000-01-01", end="2013-12-14", quote="AdjClose", provider="yahoo", origin="1970-01-01", compression="d", retclass="zoo") spx.rtn <- diff(log(spx$AdjClose)) * 100 rtn.data <- data.frame(x=time(spx.rtn),yend=spx.rtn) p <- ggplot(rtn.data) + geom_segment(aes(x=x,xend=x,y=0,yend=yend,colour=yend)) + xlab("") + ylab("S&P 500 Daily Return %") + theme(legend.position="null",axis.title.x=element_blank()) # low returns invisible p + scale_colour_gradient2(low="blue",high="red") # extreme values are grey p + scale_colour_gradient2(low="blue",high="red",limits=c(-3,3)) # log transform returns has opposite problem max_val <- max(log(abs(spx.rtn))) values <- seq(-max_val, max_val, length = 11) library(RColorBrewer) p + scale_colour_gradientn(colours = brewer_pal(type="div",pal="RdBu")(11), values = values , rescaler = function(x, ...) sign(x)*log(abs(x)), oob = identity) 

Aqui está outra possibilidade, usando scale_colour_gradientn . O mapeamento de colours é definido usando values = rescale(...) para que a resolução seja maior para valores próximos a zero. Eu dei uma olhada em algumas escalas de colors aqui: http://colorbrewer2.org . Eu escolhi um esquema de colors divergentes de 5 classs, RdBu, de vermelho para azul via quase branco. Pode haver outras escalas que atendam melhor às suas necessidades, isso é apenas para mostrar os princípios básicos.

 # 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") 

Usando o rescale , -10 corresponde ao azul # 0571B0; -1 = azul claro # 92C5DE; 0 = cinza claro # F7F7F7; 1 = vermelho claro # F4A582; 10 = vermelho # CA0020. Valores entre -1 e 1 são interpolados entre azul claro e vermelho claro, et c. Assim, o mapeamento não é linear e a resolução é maior para valores pequenos.

 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()) 

insira a descrição da imagem aqui

e quanto a:

 p + scale_colour_gradient2(low="blue",high="red",mid="purple") 

ou

 p + scale_colour_gradient2(low="blue",high="red",mid="darkgrey")