在ggplot中设置调色板的透明度/饱和度

8
让我们从 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)

enter image description here

在另一个例子中,我发现了相反的问题,即缺乏强度/饱和度。例如,来自nord包的“aurora”调色板非常好,但是对于我的目的来说,它看起来有点褪色,缺乏一些饱和度。
show_col(nord("aurora",5))

enter image description here

同样地,我尝试在内部设置 alpha 值为 1,但与 viridis 相比,这会产生不同的效果,改变了调色板。

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

在此输入图片描述
或者,我已将alpha设置为alpha()。但是,这只会更改颜色名称,但它们看起来相同。

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

enter image description here

我该如何在ggplot中减少viridis调色板的饱和度/强度,增加nord调色板的饱和度/强度?
3个回答

8
您可以调整Viridis颜色的饱和度而不使它们透明。我希望您可以在viridis函数内完成此操作,但似乎没有办法实现这一点。相反,下面的示例是一个函数,将十六进制输入颜色的向量(我们将使用viridis函数创建此向量)转换为hsv颜色空间,调整饱和度水平,然后再转换回十六进制。
下面的方法有些复杂。可能有更直接的方法来在颜色系统之间进行转换。
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))

enter image description here

并调整颜色:

show_col(vir_lite(viridis(5)))

enter image description here

你可以通过改变 dsdv 参数来改变调整后的颜色。现在让我们在图中使用调整后的颜色:
p = ggplot(faithfuld, aes(waiting, eruptions)) +
      geom_raster(aes(fill = density))

p + scale_fill_gradientn(colors=vir_lite(viridis(5)))

enter image description here

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

enter image description here


这个方法成功地降低了viridis的饱和度并增加了nord的饱和度。谢谢! - fede_luppi
我假设 ds 是指去饱和度,但是 dv 变量在这里有什么作用? - Brandon
好的,我在2.7年前写了这个答案,当时我比现在聪明,但我认为dv是对hsv颜色的值维度进行调整。 - eipi10

4
将你的 alpha 值添加到 geom_raster() 图层中:
ggplot(faithfuld, aes(waiting, eruptions)) +
    geom_raster(alpha = 0.5, aes(fill = density)) +
    scale_fill_viridis(5)

enter image description here


这个是有效的,问题在于对于我的真实数据,这个 alpha 不仅适用于 geom_raster 的填充,还适用于其他“层”,如背景、边框线等,导致整个图表变淡。 - fede_luppi
你在使用真实数据时调用了什么函数?也许你可以将这些层中的alpha重置为1。 - De Novo

1
你最后一个函数中有一个小错误。 .5show_col 中而不是在 alpha 中。因此,在 show_col 中,它被解释为四舍五入的 1,这是布尔值 TRUE,导致显示十六进制值。
因此,正确的行应该是:
show_col(alpha(nord("aurora",5), .5))

这会产生柔和的颜色。

我才意识到我没有完整地阅读问题,只是找错了括号。 - drmariod
我已经完成第一部分了,所以我们共同解决了它 :) - De Novo
谢谢你们两位!错别字解决了使用“极光”调色板包含alpha的技术方面。然而,将alpha设置为1并不影响调色板。我感觉“北欧”中的alpha被设置为<1,因此调整为1可能会增加饱和度。但是没有。所以我的问题仍然存在:如何在北欧调色板中增加饱和度(使颜色更亮)? - fede_luppi
关于使用 alpha 改变 HEX 值的注释。正常的 HEX 代码只有 3 个通道,每个通道有 2 个数字,例如 #FF3355。通过使用 alpha,您可以添加第四个通道,例如 FF 表示不透明,80 表示 50% 的透明度。 - drmariod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接