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

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

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


在内部应用Alpha透明度似乎可行。
r - 在ggplot中设置调色板的透明度/饱和度-LMLPHP

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

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


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

在另一个示例中,我发现了相反的问题,即强度/饱和度不足。例如,nord软件包中的“ aurora”调板很棒,但至少在我看来,它看起来有些褪色,缺乏一定的饱和度。

show_col(nord("aurora",5))


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

类似地,我尝试在内部将Alpha设置为1,但是与色盲相比,这产生了不同的效果,从而改变了调色板。

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


r - 在ggplot中设置调色板的透明度/饱和度-LMLPHP
另外,我将alpha设置为alpha()。但是,这只会更改颜色名称,但它们看起来相同。

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


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

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

最佳答案

您可以调整翠绿颜色以降低其饱和度而又不使其透明。我希望您可以在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))


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

以及调整后的颜色:

show_col(vir_lite(viridis(5)))


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

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

p = ggplot(faithfuld, aes(waiting, eruptions)) +
      geom_raster(aes(fill = density))

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


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

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


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

07-24 21:35