【问题标题】:Continuous color scale in ggplot with minimum and maximum valuesggplot中具有最小值和最大值的连续色标
【发布时间】:2019-08-09 21:11:39
【问题描述】:

我想设置实现极端颜色的阈值,即给定从 color1 到 color2 的渐变和相应的变量 z,我想定义值 c_min 和 c_max 使得所有点z 的值大于c_max 的点有颜色2,所有z 的值低于c_min 的点都有颜色1。示例:

df <- data.frame(x=rnorm(10), y=rnorm(10), z=c(-100, rnorm(8), 100))
ggplot(df, aes(x=x, y=y, col=z)) + geom_point() + 
  scale_color_gradient2(low="blue", mid="white", high="red")

显然,这并不令人满意:大部分点都是白色的,只有极点才会有颜色。我更喜欢将渐变跨度在 -3 和 3 之间,并且这些值之外的所有内容都应该是蓝色或红色。

当然,我可以手动生成渐变并使用 scale_color_manual 设置点的颜色:

pal <- colorRampPalette(c("blue", "white", "red"))(17)
breaks <- seq(-3, 3, length.out=16)
cols <- pal[findInterval(df$z, breaks) + 1]
plot(df$x, df$y, pch=19, col=cols)

## or, in ggplot
ggplot(df, aes(x=x, y=y, col=factor(1:nrow(df)))) + 
   geom_point() + scale_color_manual(values=cols)

如何在 ggplot2 中做到这一点?最好不用手动计算梯度?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    一种选择是设置比例的限制并将任何超出限制(超出范围/oob 值)的内容压缩到最接近的极端:

    ggplot(df, aes(x=x, y=y, col=z)) + geom_point() + 
      scale_color_gradient2(low="blue", mid="white", high="red", 
                            limits = c(-3, 3), oob = scales::squish)
    

    另一个选项是手动设置颜色应该出现在scale_color_gradient 中的位置(重新缩放到 [0-1] 范围后)。重复 "blue""red" 以给出该颜色的极端 (0, 1) 和重新缩放的 -3/3 (0.485/0.515)。

    ggplot(df, aes(x=x, y=y, col=z)) + geom_point() + 
      scale_color_gradientn(colours = c("blue", "blue", "white", "red", "red"),
                            values = c(0, 0.485, 0.5, 0.515, 1))
    

    【讨论】:

      猜你喜欢
      • 2019-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多