【问题标题】:What is a "good" palette for divergent colors in R? (or: can viridis and magma be combined together?)什么是 R 中不同颜色的“好”调色板? (或者:绿色和岩浆可以结合在一起吗?)
【发布时间】:2016-09-25 18:19:51
【问题描述】:

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

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 color palettes,我就希望能把绿色和岩浆结合起来,形成这样不同的颜色(当然,色盲的人只会看到颜色的绝对值,但有时也可以)。

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

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

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

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

这个确实比较好,但是不知道有没有更好的解决方案。

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

谢谢!

【问题讨论】:

  • 我会在Color Brewer 上建立一个好的调色板。例如,rwb &lt;- colorRampPalette(colors = c('#9e0142','#d53e4f','#f46d43','#fdae61','#fee08b','#ffffbf','#e6f598','#abdda4','#66c2a5','#3288bd','#5e4fa2')).

标签: python r matplotlib colors viridis


【解决方案1】:

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

  1. 绿色和岩浆调色板是具有多种色调的连续调色板。因此,沿着刻度,您会从非常浅的颜色增加到相当深的颜色。同时色彩增加,色调从黄色变为蓝色(通过绿色或通过红色)。
  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 以及针对气象学的进一步建议,但适用于其他方面,在http://dx.doi.org/10.1175/BAMS-D-13-00155.1 的 BAMS 论文中。)

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

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

例如,Moreland 的“冷暖”调色板使用蓝色 (h = 250) 和红色 (h = 10) 色调,但亮度对比度相对较小(l = 37l = 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 中作为命名调色板使用包和基本grDevices 包中的hcl.colors() 函数(从3.6.0 开始)。因此,您现在也可以轻松地说:

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

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

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

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

【讨论】:

  • @TalGalili 没问题。我想我们讨论了 ColorBrewer.org 调色板,与colorspace 和其他基本 R 调色板相比,我在 userR 上进行了演示! 2009 年在雷恩,不是吗?但那是很久以前的事了...... :-)
  • 很可能是 Achim :) 你觉得上面描述的 cool_warm 调色板怎么样?
  • 如果您想要低亮度对比度,冷暖调色板是不错的选择。在他的论文中,Moreland 认为这通常很有用。但根据您想要展示的内容,高亮度对比度可能会更好。 ColorBrewer.org 的大多数不同调色板都具有高亮度对比度,但也有一些具有低亮度对比度。我现在已经扩展了我的回复,以更详细地讨论这个问题。此外,我展示了通过使用我们基于 HCL 的调色板和适当的坐标,您可以非常接近其他提案。
【解决方案2】:

scico 包(基于 Scientific Colour-Maps 的 R 调色板)有几个很好的发散调色板,它们在感知上是统一的和色盲安全的(例如,vikromaberlin)。

也可用于 Python、MatLab、GMT、QGIS、Plotly、Paraview、VisIt、Mathematica、Surfer、d3 等here

论文:Crameri, F.(2018 年),地球动力学诊断、科学可视化和 StagLab 3.0,Geosci。模型开发, 11, 2541-2562, doi:10.5194/gmd-11-2541-2018

博客The Rainbow Colour Map (repeatedly) considered harmful

# install.packages('scico')
# or
# install.packages("devtools")
# devtools::install_github("thomasp85/scico")
library(scico)
scico_palette_show(palettes = c("broc", "cork", "vik",
                                "lisbon", "tofino", "berlin",
                                "batlow", "roma"))

另一个很棒的软件包是 cmocean。它的颜色图在 R 中通过 pals 包或 oce 包提供。

论文:Thyng, K. M.、Greene, C. A.、Hetland, R. D.、Zimmerle, H. M. 和 DiMarco, S. F. (2016)。海洋学的真实色彩。海洋学, 29(3), 10, http://dx.doi.org/10.5670/oceanog.2016.66.

谈话PLOTCON 2016: Kristen Thyng, Custom Colormaps for Your Field

### install.packages("devtools")    
### devtools::install_github("kwstat/pals")   
library(pals)   
pal.bands(ocean.balance, ocean.delta, ocean.curl, main = "cmocean")   


编辑:从rcartocolor 包中添加最多七层 色盲友好调色板

library(rcartocolor)
display_carto_all(type = 'diverging', colorblind_friendly = TRUE)

【讨论】:

  • Crameri 的许多科学调色板(可通过 R 包 scico 获得)也可以通过 colorspace 的基于 HCL 的策略很好地近似。如需选择,请参阅:colorspace.R-Forge.R-project.org/articles/…
  • @AchimZeileis:太棒了!非常感谢您的链接!出于好奇,您是否有任何个人最喜欢的颜色图(顺序的和发散的)在众多包中提供的所有颜色图?
  • 并非如此。 ColorBrewer 有许多有用的调色板,CARTO 和其他调色板也是如此。我的偏好会随着时间的推移而不断变化,也取决于用什么样的图形来可视化。此外,我经常通过更改一些 HCL 细节来调整/自定义现有的调色板。
  • 很棒的答案。我打算选择它作为“首选”答案,因为我认为它可以更好地概述可用的解决方案。
【解决方案3】:

我发现Kenneth Moreland's proposal 非常有用。现在已经在heatmaply中实现为cool_warm

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

与插值的 RColorBrewer "RdBu" 相比,这就是它的实际效果:

【讨论】:

  • 感谢您的信息,我添加了“故障”标志
  • 更新:显然有人在 CRAN 包中提供了这个:-)
【解决方案4】:

RColorBrewer 为=BrBG 显示从棕色到绿色的不同颜色。

library(RColorBrewer)
display.brewer.pal(11, "BrBG")

通过在中间点颜色之间创建调色板,可以将其扩展为信息量较少的调色板。

brbg <- brewer.pal(11, "BrBG")
cols <- c(colorRampPalette(c(brbg[1], brbg[6]))(51), 
    colorRampPalette(c(brbg[6], brbg[11]))(51)[-1])

类似地,使用您选择的viridismagma 调色板,您可以尝试找出它们之间的相似之处。这可能是一个点,将调色板背靠背连接在一起。

select.col <- function(cols1, cols2){
    x <- col2rgb(cols1)
    y <- col2rgb(cols2)
    sim <- which.min(colSums(abs(x[,ncol(x)] - y)))
    message(paste("Your palette will be", sim, "colors shorter."))
    cols.x <- apply(x, 2, function(temp) rgb(t(temp)/255))
    cols.y <- apply(y[,sim:ncol(y)], 2, function(temp) rgb(t(temp)/255))
    return(c(cols.x,cols.y))
}

img(select.col(rev(viridis(100,0)),magma(100,0)), "")
# Your palette will be 16 colors shorter.

【讨论】:

    【解决方案5】:

    Viridis 现在提供了 cividis 色带,它基本上是一个发散色带。也是their recommended color ramp

    【讨论】:

    • 谢谢,很高兴知道:) 但是,由于它是从亮到暗,我不认为这是一个发散的色带。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 2021-01-10
    • 2018-07-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多