什么是 R 中不同颜色的“好”调色板? (或者:viridis和magma可以结合在一起吗?)

新手上路,请多包涵

我有兴趣拥有一个“好”的发散调色板。显然可以只使用红色、白色和蓝色:

 img <- function(obj, nam) {
  image(1:length(obj), 1, as.matrix(1:length(obj)), col=obj,
        main = nam, ylab = "", xaxt = "n", yaxt = "n",  bty = "n")
}
rwb <- colorRampPalette(colors = c("red", "white", "blue"))
img(rwb(100), "red-white-blue")

在此处输入图像描述

因为最近迷上了 viridis的调色板,所以希望能把viridis和magma结合起来,形成这样发散的颜色(当然,色盲的人只会看到颜色的绝对值,但有时也可以)。

当我尝试结合 viridis 和 magma 时,我发现它们不会在同一个地方“结束”(或“开始”),所以我得到这样的结果(我正在使用 R,但这可能与蟒蛇用户):

 library(viridis)
img(c(rev(viridis(100, begin = 0)), magma(100, begin = 0)), "magma-viridis")

在此处输入图像描述

我们可以看到,当接近于零时,viridis 是紫色的,而岩浆是黑色的。我希望它们都从(或多或少)同一个位置开始,所以我尝试使用 0.3 作为起点:

 img(c(rev(viridis(100, begin = 0.3)), magma(100, begin = 0.3)), "-viridis-magma(0.3)")

在此处输入图像描述

这样确实更好,但是不知道有没有更好的解决办法。

(我也在“标记” python 用户,因为 viridis 最初来自 matplotlib ,所以使用它的人可能知道这样的解决方案)

谢谢!

原文由 Tal Galili 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

我发现 Kenneth Moreland 的提议 非常有用。它现在已在 --- 中实现为 cool_warm heatmaply

 # install.packages("heatmaply")
img(heatmaply::cool_warm(500), "Cool-warm, (Moreland 2009)")

冷暖色图 与插值的 RColorBrewer“RdBu”相比,它在实际操作中的样子: 比较

原文由 jan-glx 发布,翻译遵循 CC BY-SA 4.0 许可协议

已经有一些好的和有用的建议,但让我补充几点:

  1. viridis 和 magma 调色板是具有多种色调的连续调色板。因此,沿着比例尺,您可以从非常浅的颜色增加到相当深的颜色。同时,色彩度增加,色调从黄色变为蓝色(通过绿色或通过红色)。
  2. 可以通过组合两个顺序调色板来创建发散调色板。通常,您以浅色加入它们,然后让它们分叉成不同的深色。
  3. 通常,人们使用从中性浅灰色到两种不同深色的单色调连续调色板。人们应该注意,尽管调色板的不同“臂”在亮度(明暗)和色度(色彩)方面是平衡的。

因此,将岩浆和绿色结合起来效果不佳。你可以让它们从类似的淡黄色发散,但你会发散到类似的淡蓝色。此外,随着色调的变化,判断您属于调色板的哪一臂会变得更加困难。

正如其他人所提到的,ColorBrewer.org 提供了很好的发散调色板。 Moreland 的方法也很有用。另一个通用解决方案是我们在 colorspace 包中的 --- diverging_hcl() 函数。在 https://arxiv.org/abs/1903.06490 (即将在 JSS 中发表)的随附论文中,描述了构造原则以及基于 HCL 的一般策略如何近似来自 ColorBrewer.org、CARTO 等的众多调色板。(早期参考资料包括我们在 CSDA 中的初步工作 http://dx.doi.org/10.1016/j.csda.2008.11.033 以及针对气象学的进一步建议,但适用于 BAMS 论文 http://dx.doi .org/10.1175/BAMS-D-13-00155.1 。)

我们在 HCL 空间(色调-色度-亮度)中的解决方案的优势在于您可以相对轻松地解释坐标。它确实需要一些练习,但不像其他解决方案那样不透明。我们还提供了一个 GUI hclwizard() (见下文),有助于理解不同坐标的重要性。

问题中的大多数调色板和其他答案可以通过 diverging_hcl() 相当接近地匹配,前提是两种色调(参数 h ),最大色度( c ) 和最小/最大亮度 ( l ) 被适当地选择。此外,可能需要调整 power 参数,该参数分别控制色度和亮度的增加速度。通常,色度添加得相当快( power[1] < 1 ),而亮度增加得更慢( power[2] > 1 )。

例如,Moreland 的“冷-暖”调色板使用蓝色 ( h = 250 ) 和红色 ( h = 10 ) 色调,但亮度对比度相对较小 ( l = 37 ) l = 88 ):

 coolwarm_hcl <- colorspace::diverging_hcl(11,
  h = c(250, 10), c = 100, l = c(37, 88), power = c(0.7, 1.7))

它看起来非常类似于(见下文):

 coolwarm <- Rgnuplot:::GpdivergingColormap(seq(0, 1, length.out = 11),
  rgb1 = colorspace::sRGB( 0.230, 0.299, 0.754),
  rgb2 = colorspace::sRGB( 0.706, 0.016, 0.150),
  outColorspace = "sRGB")
coolwarm[coolwarm > 1] <- 1
coolwarm <- rgb(coolwarm[, 1], coolwarm[, 2], coolwarm[, 3])

相比之下,ColorBrewer.org 的 BrBG 调色板具有更高的亮度对比度( l = 20l = 95 ):

 brbg <- rev(RColorBrewer::brewer.pal(11, "BrBG"))
brbg_hcl <- colorspace::diverging_hcl(11,
  h = c(180, 50), c = 80, l = c(20, 95), power = c(0.7, 1.3))

下面将生成的调色板与原始调色板下方的基于 HCL 的版本进行比较。您会看到它们并不完全相同,而是非常接近。在右侧,我还将 viridis 和 plasma 与基于 HCL 的调色板相匹配。

调色板

您是喜欢冷暖色调还是 BrBG 色调可能取决于您的个人品味,但更重要的是,还取决于您想要在可视化中展现的内容。如果偏差的 符号 最重要,则冷暖中的低亮度对比度将更有用。如果您想显示(极端)偏差的 _大小_,高亮度对比度会更有用。上述论文提供了更多实用指南。

上图的其余复制代码是:

 viridis <- viridis::viridis(11)
viridis_hcl <- colorspace::sequential_hcl(11,
  h = c(300, 75), c = c(35, 95), l = c(15, 90), power = c(0.8, 1.2))

plasma <- viridis::plasma(11)
plasma_hcl <- colorspace::sequential_hcl(11,
  h = c(-100, 100), c = c(60, 100), l = c(15, 95), power = c(2, 0.9))

pal <- function(col, border = "transparent") {
  n <- length(col)
  plot(0, 0, type="n", xlim = c(0, 1), ylim = c(0, 1),
    axes = FALSE, xlab = "", ylab = "")
  rect(0:(n-1)/n, 0, 1:n/n, 1, col = col, border = border)
}

par(mar = rep(0, 4), mfrow = c(4, 2))
pal(coolwarm)
pal(viridis)
pal(coolwarm_hcl)
pal(viridis_hcl)
pal(brbg)
pal(plasma)
pal(brbg_hcl)
pal(plasma_hcl)

更新: 这些来自其他工具(ColorBrewer.org、viridis、scico、CARTO 等)的基于 HCL 的近似颜色现在也可以作为命名调色板在 colorspace 包和 hcl.colors() 基本功能 grDevices 包(从 3.6.0 开始)。因此,您现在也可以轻松地说:

 colorspace::sequential_hcl(11, "viridis")
grDevices::hcl.colors(11, "viridis")

最后,您可以在闪亮的应用程序中以交互方式探索我们建议的颜色: http ://hclwizard.org:64230/hclwizard/。对于 R 的用户,您还可以在您的计算机上本地启动 shiny 应用程序(它运行速度比我们的服务器快一些)或者您可以运行它的 Tcl/Tk 版本(甚至更快):

 colorspace::hclwizard(gui = "shiny")
colorspace::hclwizard(gui = "tcltk")

如果您想了解调色板路径在 RGB 和 HCL 坐标中的样子, colorspace::specplot() 很有用。参见示例 colorspace::specplot(coolwarm)

原文由 Achim Zeileis 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏