Небольшое изменение значения невидимо с помощью scale_colour_gradient2

Я хотел бы сделать небольшие возвраты на этом графике более заметными. Наиболее подходящая функция, кажется,scale_colour_gradient2, но это размывает небольшие доходы, которые происходят чаще всего. С помощьюlimits помогло, но я не мог понять, как установить oob (вне пределов), чтобы он имел просто «насыщенное» значение, а не серый. И преобразование лога только что выделило небольшие значения. Кто-то еще понял, как это сделать элегантно?

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)

Ответы на вопрос(2)

Ваш ответ на вопрос