matplotlib 对于R中的不同颜色,什么是“好的”调色板?(或者:草绿色和岩浆能结合在一起吗?)

pdtvr36n  于 2023-03-09  发布在  其他
关注(0)|答案(6)|浏览(362)

我对一个“好的”发散调色板很感兴趣。很明显,你可以只使用红色、白色和蓝色:

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时,草绿色是紫色的,而岩浆是黑色的,我希望它们都从(或多或少)相同的点开始,所以我尝试使用0.3作为起点:

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

这样做确实比较好,但我不知道是否有更好的解决办法。
(我也在“标记”python用户,因为viridis最初来自matplotlib,所以使用它的人可能知道这样的解决方案)
谢谢!

fkaflof6

fkaflof61#

已经有一些好的和有用的建议,但让我补充几点:
1.草绿色和岩浆色是具有多种色调的连续调色板。因此,沿着刻度,你可以从非常浅的颜色增加到相当深的颜色。同时,色彩增加,色调从黄色变为蓝色(通过绿色或红色)。
1.可以通过组合两个连续的调色板来创建发散调色板。通常,您可以在浅色处将它们连接起来,然后让它们发散为不同的深色。
1.通常,人们使用单一色调的连续调色板,从中性浅灰色到两种不同的深色。人们应该注意调色板的不同“手臂”在亮度(亮-暗)和色度(色彩)方面是平衡的。
因此,混合岩浆和草绿色效果并不好,你可以让它们从类似的黄色发散出来,但你会发散到类似的蓝色,而且随着色调的变化,你会变得更难判断你在调色板的哪一边。
正如其他人所提到的,ColorBrewer.org提供了良好的发散调色板。莫兰的方法也很有用。还有一个通用的解决方案是colorspace包中的diverging_hcl()函数。(即将在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)。
例如,莫兰的“冷-暖”调色板使用蓝色(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的调色板进行了比较。您可以看到它们并不完全相同,但相当接近。在右手边,我还将草绿色和等离子色与基于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基本包(从3.6.0开始)的hcl.colors()函数中使用。

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

最后,您可以在一个闪亮的应用程序中交互式地探索我们建议的颜色:对于R的用户来说,你也可以在你的本地电脑上启动这个闪亮的应用程序(比从我们的服务器上运行要快一些),或者你可以运行它的Tcl/Tk版本(甚至更快):

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

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

0yycz8jy

0yycz8jy2#

**scico**包(基于科学色彩Map的R调色板)具有几个良好的发散调色板,这些调色板在感知上均匀且色盲安全(例如,vikromaberlin)。

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

论文:Crameri,F.(2018),地球动力学诊断、科学可视化和StagLab 3.0,地球科学模型开发,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**。它的色彩Map表可以通过pals软件包或oce软件包在R中获得。

论文:Thyng,K. M.,格林,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)

68bkxrlz

68bkxrlz3#

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

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


这是与插值RColorBrewer“RdBu”相比的实际效果:

uqxowvwt

uqxowvwt4#

RColorBrewer为=〈13种颜色提供漂亮的调色板。例如,调色板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.

t5fffqht

t5fffqht5#

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

wfsdck30

wfsdck306#

Viridis 0.6.0(2021年年中推出)增加了3种色彩Map:makorocketturbo。如果您真的想将两个viridis封装色彩Map组合成一个不同的方案,那么makorocket(均来自Seaborn)将是显而易见的选择-但我想谈谈turbo,它的制造商声称它在发散音阶中效果很好。让我们借用一张插图,然后 * 哇!* turbo是不是令人不安......光谱?这是多么 * 反viridislike *?!https://cran.r-project.org/web/packages/viridis/vignettes/intro-to-viridis.html

如果我去饱和该图像,我们看到turbo突出像一个拇指痛作为唯一的(自版本0.6.2)viridis包色彩Map表有发散的亮度,虽然不是完全对称的非常高和非常低的值。

每个人都知道彩虹不好,对吧?它们在视觉上不一致,对于各种色盲的人来说完全是一团糟,而且当以灰度打印时看起来毫无意义。viridis的 Package 小插图指出了base R的rainbow.colors中明显的“扭结”,即颜色渐变在视觉上不平滑。并且使用X1 M13 N1 X包来显示调色板在模拟色盲下的表现有多差。

Nuñez、安德顿和Renslow在论文中介绍了cividis,这是viridis色彩图的一个版本,可作为viridis包中的替代品(见上图),经过优化,对色盲更安全。他们对广泛使用的光谱色彩图jet提出了一些合理的严厉批评。https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0199239

Kovesi叠加到测试图像上的不同色图与纳米级二次离子质谱图像之间的比较。色图如下:(a)感知上均匀的灰度级,(B)喷射,(c)红绿色盲者看起来的喷射,以及(d)绿色,当前的金标准色图。在每个NanoSIMS图像下面是相应的“色图-数据感知灵敏度”(CDPS)图,比较色图与实际色图的感知差异,m是拟合线的斜率,r2是使用简单线性回归计算的决定系数。中的亮黄色点是数据可能被误解的明显示例(B)和(c),这两个区域的值明显高于周围区域。然而,实际上,暗红色(b)和深黄色(c)实际上代表最高值。对于红绿色盲的人来说,由于色图中心的宽而亮的条带中的值难以区分,因此更难以解释。
很明显,光谱色彩Map是一个“有龙出没”的行业,尤其是当你高度重视可访问性的时候,但是在Nuñez、安德顿和Renslow的论文的结尾有一个有趣的评论:他们并不期望cividis取代viridis,因为针对色盲的优化也有一定的缺点。他们的目标的直接结果是cividisviridis色彩更少:这意味着许多人对viridis有审美偏好,但也意味着视力正常的人对cividis中的颜色线索的使用能力较低,因此他们的视觉感知不如使用viridis时敏感。这是一个关注这个空间的时刻,因为研究人员宣布,他们希望在未来版本的色盲友好Map中引入更多颜色。但他们并不完全相信这是一个可以被平方的圆。这确实提出了一个问题,如果你准备接受某些权衡,那么给读者更广泛的颜色范围会带来什么样的感知好处?
这就是turbo的用武之地,turbo被称为“改进的彩虹”。它是由谷歌(Google)现已解散的Daydream VR部门开发的,目的是帮助生成计算机视觉问题(尤其是深度感知)的假彩色图像。在这个领域,前面提到的jet色彩Map图无处不在,尽管它存在众所周知的问题。为什么要使用可怕的彩虹呢?好吧,在下面的图片中,请尝试判断左侧的哪个球体与右侧的哪个环对齐,这些图片摘自介绍turbo的Google博客文章。https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html

在灰度中,这几乎是不可能完成的任务:很难比较或匹配图像不同区域的灰度,这是任何接触过checker shadow illusion的人都知道的。但在viridisinferno中,也好不到哪里去!jetturbo的色调范围允许更快更容易地进行比较。但是我们可以看到由于“扭结”而产生的人工条带效应。我们之前抱怨过jet中的深黄色,而turbo的设计在亮度和色调变化方面都更加平滑。青色/蓝色边界也得到了很大改善。这在turbojet的量化版本中也可以看到,您可能会将其用于离散数据:它的创造者声称turbo可以被量化为多达33种可区分的颜色。

识别匹配色调的功能也有助于从数字刻度阅读turbo值:我发现这个尺度上各个重要点的颜色都很有特色。

该问题要求 * 发散 * 色标,而在深度感知的用例中,我们看到turbo被用作 * 顺序 * 色标:从低到高(或者在本例中,从近到远)。然而,虽然从光谱Angular 看,其色调是连续的,但我们已经看到亮度不是。下面的亮度图有助于说明为什么turbo被认为比jet在感知上有所改善。

色图viridisinferno在更宽的范围内,亮度都呈线性增加,甚至更陡。相比之下,turbojet在其范围的中间更亮,在极端更暗。可悲的是,jet这样做是一种不均匀的方式,带有明显的条带。但是turbo在亮度上的上升和福尔斯非常平滑和对称。这就是使用turbo作为发散音阶的理由,尽管有一些警告。
以这种方式使用时,零表示绿色,负值表示蓝色阴影,正值表示红色阴影。但是,请注意,负的最小值比正的最大值暗,因此它不是真正平衡的。
它的创造者使用turbo作为一个发散尺度的一个地方是在“差异图像”中,它显示了地面真实值和估计深度之间的误差,无论是正的还是负的。我发现很难做到这一点的一件事是,我没有从配色方案中得到什么是“极端积极”和什么是“极端消极”的直观感觉:我的大脑习惯的视觉文化会假设“绿色代表正面,红色代表负面”,但这对于数据可视化来说是一个糟糕的选择,因为红绿色盲是如此普遍。无论你选择什么颜色方案,提供一个关键点都很重要!

也许不幸的是,turbo在亮度上并不是线性变化的--它更像是一个倒“U”而不是倒“V”。彩虹色彩Map的反对者确实注意到了这一点。Fabio Crameri,The Rainbow Colour Map (repeatedly) considered harmful的作者,我是 Nature Communications 一篇关于"The misuse of colour in science communication"的文章的作者之一,该文章对turbo的回应是称其为“所谓的”改进“的示例类似彩虹的Map”,这似乎满足了颜色处于直观感知顺序的要求,但“由于其亮度光谱不均匀,因此无法满足科学色彩Map的感知均匀性要求。”不过,倒“U”并非完全没有好处。您可能已经注意到inferno在显示极高或极低数据方面优于viridis,部分是因为它的亮度变化更陡(由于其范围更宽)。正如您从亮度图中所看到的,turbo在极值处具有更陡的斜率(至少在左边,即蓝色端-这是turbo不对称的地方),结合其更快的色调变化,这使得更容易区分那里的细节。在下面的假彩色图像中,“极端数据”是高距离处的树-turbo的背景明显比inferno的背景更清晰。

请阅读Google team's blog的其余部分,看看turbo在色盲模拟器下的表现如何,结果是除了色盲(罕见的完全色盲)外,它表现得相当不错,因为极端的低/高值是不明确的,所以任何亮度发散的量表都不适合色盲。

当我想要一个发散的尺度时,我会使用turbo吗?出于许多目的,我更喜欢其他答案中的一些建议,特别是因为我对彩虹的哪一端自然代表高点或低点没有很强的直觉。但turbo当然有它的优势--特别是因为它使用了更多的色调,对大多数观众来说,赋予它们更大的能力来区分小的差异,识别页面的不同部分上的值接近的区域,以及(作为后者的结果)有意义地与一个量表进行比较...所有这些都没有完全牺牲大多数色盲患者的体验。如果您喜欢viridis的封装理念,并且想要一个亮度也发散的发散色图,那么turbo是一个显而易见的选择。只是要知道,发散亮度是以有意义的灰度打印和完全色盲的人的感知为代价的。

一些替代品

我并不是第一个在本页指出Crameri反对彩虹立场的人,他的科学色图网站值得一看:https://www.fabiocrameri.ch/colourmaps/
您已经有了一些访问Crameri首选发散色标的建议,但另一个选项是the khroma package。您可以检查this vignette以查看Crameri的发散色图broccorkviklisbontofinoberlinromabamvanimo。还提供顺序和多顺序秤。
但是khroma也提供了Paul Tol基于this technical note的一套配色方案。看看separate vignette for Tol's schemes。有很多方案是针对定性数据的(故意避免连续出现),但也有一些不同的方案:sunsetBuRdPRGn显示如下。

从去饱和的图像判断,这些具有发散和相当对称的亮度。

托尔也批评彩虹方案的使用,但如果他的警告没有被注意,确实提供了一个离散和平滑的彩虹方案,对色盲来说是相当安全的。我在下面说明了这两种方案。我确实更喜欢turbo而不是托尔的连续彩虹。其中前25%是灰白色混合成紫色,后10%是红色混合成棕色。插图建议“开始-如果最低数据值经常出现,则为白色而非紫色;如果最高数据值经常出现,则以红色而不是棕色结束。”我提供了以下去饱和版本:托尔的离散彩虹在亮度上变化不规则,这对连续或发散的尺度都不好,但彩虹色调的自然排序也会是呈现定性的缺点(非连续)数据。平滑的彩虹,去掉了灰白色的紫色部分,在亮度上确实存在差异。但比turbo明显更不对称。包括灰白色部分导致不合适的亮-暗-亮-暗图案而不是真正发散的尺度。

相关问题