【问题标题】:Set transparency/saturation of palette in ggplot在ggplot中设置调色板的透明度/饱和度
【发布时间】:2018-08-16 09:51:44
【问题描述】:

让我们从viridis 调色板开始。在我看来,颜色对我来说有点太亮了,而且就我的目的而言,它们看起来太人工了。因此,我想应用某种透明度或类似的方法来降低饱和度:

library(nord)
library(scales)
library(viridis)
library(nord)

show_col(viridis(5))
show_col(viridis(5, alpha=.5))

在内部应用 alpha 透明度似乎可行。

但是,在 ggplot 中运行时,它会自动将 alpha 更改为 1,并以全强度绘制原始 viridis:

ggplot(faithfuld, aes(waiting, eruptions)) +
  geom_raster(aes(fill = density)) +
  scale_fill_viridis(5, alpha=.5)

在另一个例子中,我发现了相反的问题,缺乏强度/饱和度。例如,nord 包中的“极光”调色板很棒,但它看起来有点褪色,缺乏一些饱和度,至少对我来说是这样。

show_col(nord("aurora",5))

同样,我尝试在内部设置 alpha,在本例中为 1,但与 viridis 相比,这会产生不同的效果,即更改调色板。

show_col(nord("aurora", alpha=.5))


或者,我将 alpha 设置为 alpha()。但是,这只会改变颜色名称,但它们看起来是一样的。

show_col(alpha(nord("aurora",5)), .5)

如何降低viridis 中的饱和度/强度并增加ggplot 中的nord 调色板?

【问题讨论】:

    标签: r ggplot2 colors alpha palette


    【解决方案1】:

    将您的 alpha 值添加到 geom_raster() 层:

    ggplot(faithfuld, aes(waiting, eruptions)) +
        geom_raster(alpha = 0.5, aes(fill = density)) +
        scale_fill_viridis(5)
    

    【讨论】:

    • 这行得通,问题在于,对于我的真实数据,这不仅将 alpha 应用于 geom_raster 的填充,还应用于其他“图层”、背景、边界线等,从而使整个绘图褪色
    • 您对真实数据使用的调用是什么?您也许可以将这些图层中的 alpha 重置为 1。
    【解决方案2】:

    你的最后一个函数有一点错别字。 .5show_col 内,而不在alpha 内。因此,在 show_col 内,它会被解释为舍入的 1,这是布尔值 TRUE,这会导致显示 HEX 值。

    所以正确的行应该是

    show_col(alpha(nord("aurora",5), .5))
    

    这会产生微弱的颜色。

    【讨论】:

    • 我刚刚意识到我没有阅读完整的问题:-D 只是发现了错误的括号。
    • 好吧,我在第 1 部分停止了,所以我们之间解决了它:)
    • 感谢两位!错字解决了在“极光”调色板中包含 alpha 的技术方面。但是,将 alpha 设置为 1 不会影响调色板。我感觉“nord”中的 alpha 设置为
    • 只是对使用 alpha 更改的 HEX 值的评论。正常的 HEX 代码只有 3 个通道时间 2 位数字,如 #FF3355,通过使用 alpha,您可以向其添加第 4 个通道,例如 FF 没有透明度,80 透明度为 50%。
    【解决方案3】:

    您可以调整 viridis 颜色以降低其饱和度而不使其透明。我希望你可以在 viridis 函数中做到这一点,但看起来没有办法做到这一点。相反,下面的示例是将十六进制输入颜色向量(我们将使用 viridis 函数创建此向量)转换为 hsv 颜色空间的函数,调整 saturationvalue 级别,然后转换回到十六进制。

    下面的方法有点复杂。在颜色系统之间转换可能有更直接的方法。

    vir_lite = function(cols, ds=0.4, dv=0.7) {
      cols = rgb2hsv(col2rgb(cols))
      cols["v", ] = cols["v", ] + dv*(1 - cols["v", ])
      cols["s", ] = ds*cols["s", ]
      apply(cols, 2, function(x) hsv(x[1], x[2], x[3]))
    }
    

    这里是原始的viridis 颜色:

    show_col(viridis(5))
    

    以及调整后的颜色:

    show_col(vir_lite(viridis(5)))
    

    您可以通过更改dsdv 参数来更改调整后的颜色。现在让我们在图中使用调整后的颜色:

    p = ggplot(faithfuld, aes(waiting, eruptions)) +
          geom_raster(aes(fill = density))
    
    p + scale_fill_gradientn(colors=vir_lite(viridis(5)))
    

    p + scale_fill_gradientn(colors=vir_lite(viridis(5), ds=0.6, dv=0.5))
    

    【讨论】:

    • 这既可以降低 viridis 的饱和度,又可以增加 nord 的饱和度。谢谢!
    • 我假设ds 用于去饱和,但dv 变量在这里做什么?
    • 嗯,这个答案是我2.7年前写的,那时我比现在聪明,但我认为dv是对hsv颜色值维度的调整。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 2011-05-26
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 2022-08-11
    相关资源
    最近更新 更多