【问题标题】:How to specify manual color scale in ggplot2 of R?如何在 R 的 ggplot2 中指定手动色标?
【发布时间】:2020-05-13 14:10:46
【问题描述】:

我有ggplot 手动色标,指定midpoint = 2.5 如下;

#create dataframe
df <-data.frame(x = c(rnorm(300, 3, 2.5), rnorm(150, 7, 2)), # create random data
                  y = c(rnorm(300, 6, 2.5), rnorm(150, 2, 2)),
                  z = c(rnorm(300, 6, 2.5), rnorm(150, 2, 2)))
#plot
gg <-ggplot(df, aes(x=x, y=y, color=z)) + 
       geom_point() + 
       scale_color_gradient2(midpoint=2.5, low="red", mid="white",high="blue", space ="Lab")

,结果如下图;

在这里,我想在色标的最小边缘设置更鲜艳(或深)的红色(即#FF0000 或 rgb(255,0,0))(即最小 z 值为min(df$z)[1] -3.718939) .

在这种情况下,我不想移动midpoint = 2.5

你有什么解决办法吗?

添加注释以响应第一个答案

我想在 z 最大值处保持蓝色鲜艳的颜色,就像原始图中一样。由于第一个答案,我注意到scale_color_gradient2 中存在trans =。但是,我不知道如何解决我的问题。

【问题讨论】:

    标签: r ggplot2 colors


    【解决方案1】:

    考虑到您的样本,中点将数据分成大约 25% 和 75%。

    我们可以使用具有四种颜色调用和白色作为第二种颜色的 scale_color_gradientn 来代替具有三个颜色调用的 scale_color_gradient2(因为中间品脱刚好高于 25%。

    gg <-ggplot(df, aes(x=x, y=y, color=z)) + 
      geom_point() + 
      scale_color_gradientn(colors=c("red","white", "blue", "darkblue"), space ="Lab")
    

    P.S.:你也可以试试colors=c("red","white", "lightblue", "blue")

    【讨论】:

      【解决方案2】:

      您的渐变已经设置为#FF0000 作为最小值。比例是线性的,因此无法绕过。

      相反,您可以考虑在scale_color_gradient2 调用中使用trans= 转换您的色标。

      默认值为loglog2sqrt。由于z 的值为负,这些都不是非常有用。

      您可以改为使用 scales 设置自定义转换函数:

      library(ggplot2)
      library(scales)
      asinh_trans <- scales::trans_new("asinh_trans",
                                      transform=function(x) asinh(x),
                                      inverse=function(x) sinh(x))
      
      ggplot(df, aes(x=x, y=y, color=z)) + 
             geom_point() + 
             scale_color_gradient2(midpoint=asinh(2.5),
                                   low="red",
                                   mid="white",
                                   high="blue",
                                   trans=asinh_trans,
                                   space ="Lab")
      

      我同意这看起来并不完美,但您可以通过设置自己的 trans_new 函数轻松设置任意转换。

      【讨论】:

      • 非常感谢您的回答。谢谢你,我学会了trans。但是,我想在 z 最大值处保持蓝色与原始鲜艳的颜色一样。您还有其他方法可以做到这一点吗?
      • 我已通过将中点更改为asinh(2.5) 对其进行了编辑,我认为这可能对您有用。
      猜你喜欢
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 2015-08-02
      • 2020-08-28
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      相关资源
      最近更新 更多