【问题标题】:Increase resolution of color scale for values close to zero为接近零的值增加色标分辨率
【发布时间】:2013-12-14 09:42:22
【问题描述】:

我想让这个情节中的小额回报更加明显。最合适的函数似乎是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)

【问题讨论】:

    标签: r colors ggplot2


    【解决方案1】:

    这是另一种可能性,使用scale_colour_gradientncolours 的映射是使用values = rescale(...) 设置的,因此对于接近零的值,分辨率更高。我在这里查看了一些色标:http://colorbrewer2.org。我选择了 5 级发散配色方案 RdBu,从红色到蓝色通过近白色。可能还有其他比例更适合您的需求,这只是为了展示基本原则。

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

    使用rescale,-10对应蓝色#0571B0; -1 = 浅蓝色#92C5DE; 0 = 浅灰色#F7F7F7; 1 = 浅红色#F4A582; 10 = 红色#CA0020。 -1 和 1 之间的值在浅蓝色和浅红色等之间进行插值。因此,映射不是线性的,小值的分辨率更高。

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

    【讨论】:

    • 完美!该解决方案非常灵活,因为我可以将映射函数设置为在零区域周围更加精细。非常感谢 Henrik,您为我节省了数小时(更多)的实验时间!
    【解决方案2】:

    怎么样:

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

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

    【讨论】:

    • 谢谢特洛伊,我试过了,它确实有效,但我想保持白色作为“中心”中性色。
    猜你喜欢
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 2021-11-10
    • 2012-11-28
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多