什么是 "good" R 中不同颜色的调色板? (或者:viridis和magma可以结合在一起吗?)
What is a "good" palette for divergent colors in R? (or: can viridis and magma be combined together?)
我有兴趣拥有一个 "good" 不同的调色板。显然可以只使用红色、白色和蓝色:
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结合成这样发散的颜色(当然,色盲的人只能看到颜色的绝对值,但是有时 o.k.).
当我尝试结合 viridis 和 magma 时,我发现它们没有 "end"(或 "start")在同一个地方,所以我得到这样的结果(我使用的是 R ,但这对于 python 用户可能是相同的):
library(viridis)
img(c(rev(viridis(100, begin = 0)), magma(100, begin = 0)), "magma-viridis")
我们可以看到当接近于零时,viridis 是紫色的,而magma 是黑色的。我希望它们都从(或多或少)同一个位置开始,所以我尝试使用 0.3 作为起点:
img(c(rev(viridis(100, begin = 0.3)), magma(100, begin = 0.3)), "-viridis-magma(0.3)")
这样确实更好,但不知道有没有更好的解决办法。
(我也是"tagging"python用户,因为viridis最初来自matplotlib
,所以用过的人可能知道这样的解决方案)
谢谢!
库 RColorBrewer
为 =<13 种颜色提供了漂亮的调色板。例如,调色板 BrBG
显示从棕色到绿色的不同颜色。
library(RColorBrewer)
display.brewer.pal(11, "BrBG")
可以通过为 mid-point 颜色创建调色板来将其扩展为信息量较少的调色板。
brbg <- brewer.pal(11, "BrBG")
cols <- c(colorRampPalette(c(brbg[1], brbg[6]))(51),
colorRampPalette(c(brbg[6], brbg[11]))(51)[-1])
类似地,使用您选择的 viridis
和 magma
调色板,您可以尝试找到它们之间的相似性。这可能是一个点,在哪里背靠背加入调色板。
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.
我发现 Kenneth Moreland's proposal 很有用。它现在已在 heatmaply
:
中实现为 cool_warm
# install.packages("heatmaply")
img(heatmaply::cool_warm(500), "Cool-warm, (Moreland 2009)")
与插值 RColorBrewer“RdBu”相比,它在实际中的样子:
已经有一些好的和有用的建议,但让我补充几点:
- viridis 和 magma 调色板是具有多种色调的连续调色板。因此,沿着比例尺,您可以从非常浅的颜色增加到相当深的颜色。同时色彩度增加,色调从黄色变为蓝色(通过绿色或通过红色)。
- 可以通过组合两个顺序调色板来创建发散调色板。通常,您以浅色加入它们,然后让它们分叉成不同的深色。
- 通常,人们使用从中性浅灰色到两种不同深色的单色调连续调色板。应该注意的是,不同的 "arms" 调色板在亮度(明暗)和色度(色彩)方面是平衡的。
因此,将magma和viridis结合起来效果不佳。你可以让它们从类似的淡黄色发散,但你会发散到类似的淡蓝色。此外,随着色调的变化,判断您属于调色板的哪一臂会变得更加困难。
正如其他人所提到的,ColorBrewer.org 提供了很好的发散调色板。 Moreland 的方法也很有用。另一个通用解决方案是 colorspace
包中的 diverging_hcl()
函数。在 https://arxiv.org/abs/1903.06490(即将在 JSS 中发表)的随附论文中,描述了构造原则以及基于 HCL 的一般策略如何近似来自 ColorBrewer.org、CARTO 等的众多调色板。
(较早的参考资料包括我们在 http://dx.doi.org/10.1016/j.csda.2008.11.033 and further recommendations geared towards meteorology, but applicable beyond, in a BAMS paper at http://dx.doi.org/10.1175/BAMS-D-13-00155.1 的 CSDA 中的初步工作。)
我们在 HCL space(色调-色度-亮度)中的解决方案的优势在于您可以相对轻松地解释坐标。它确实需要一些练习,但不像其他解决方案那样不透明。我们还提供了一个 GUI hclwizard()
(见下文),有助于理解不同坐标的重要性。
问题中的大多数调色板和其他答案都可以与 diverging_hcl()
相当接近地匹配,前提是两种色调(参数 h
)、最大色度(c
), 和 minimal/maximal 亮度 (l
) 被适当地选择。此外,可能需要调整 power
参数,该参数分别控制色度和亮度增加的速度。通常,色度增加得相当快 (power[1] < 1
),而亮度增加得较慢 (power[2] > 1
)。
例如,Moreland 的 "cool-warm" 调色板使用蓝色 (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 = 20
对比 l = 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 调色板可能取决于您的个人品味,但更重要的是,还取决于您想要在可视化中展现的内容。如果偏差的 符号 最重要,冷暖中的低亮度对比度将更有用。如果要显示(极端)偏差的 size,高亮度对比度会更有用。上面的论文提供了更实用的指导。
上图的其余复制代码为:
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")
最后,您可以在闪亮的应用程序中以交互方式探索我们推荐的颜色:
http://hclwizard.org:64230/hclwizard/。对于 R 的用户,您还可以在您的计算机上本地启动 shiny 应用程序(运行s 比我们的服务器快一些)或者您可以 运行 它的 Tcl/Tk 版本(它甚至更快):
colorspace::hclwizard(gui = "shiny")
colorspace::hclwizard(gui = "tcltk")
如果您想了解调色板路径在 RGB 和 HCL 坐标中的样子,colorspace::specplot()
很有用。例如参见 [=36=].
scico
package (Palettes for R based on the Scientific Colour-Maps ) has several good diverging palettes that are perceptually uniform and colorblind safe (e.g., vik
, roma
, berlin
).
也可用于 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. Its colormaps are available in R via the pals
package or the 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)
Viridis 现在提供 cividis 色带,它基本上是发散色带。也是their recommended color ramp。
我有兴趣拥有一个 "good" 不同的调色板。显然可以只使用红色、白色和蓝色:
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结合成这样发散的颜色(当然,色盲的人只能看到颜色的绝对值,但是有时 o.k.).
当我尝试结合 viridis 和 magma 时,我发现它们没有 "end"(或 "start")在同一个地方,所以我得到这样的结果(我使用的是 R ,但这对于 python 用户可能是相同的):
library(viridis)
img(c(rev(viridis(100, begin = 0)), magma(100, begin = 0)), "magma-viridis")
我们可以看到当接近于零时,viridis 是紫色的,而magma 是黑色的。我希望它们都从(或多或少)同一个位置开始,所以我尝试使用 0.3 作为起点:
img(c(rev(viridis(100, begin = 0.3)), magma(100, begin = 0.3)), "-viridis-magma(0.3)")
这样确实更好,但不知道有没有更好的解决办法。
(我也是"tagging"python用户,因为viridis最初来自matplotlib
,所以用过的人可能知道这样的解决方案)
谢谢!
库 RColorBrewer
为 =<13 种颜色提供了漂亮的调色板。例如,调色板 BrBG
显示从棕色到绿色的不同颜色。
library(RColorBrewer)
display.brewer.pal(11, "BrBG")
可以通过为 mid-point 颜色创建调色板来将其扩展为信息量较少的调色板。
brbg <- brewer.pal(11, "BrBG")
cols <- c(colorRampPalette(c(brbg[1], brbg[6]))(51),
colorRampPalette(c(brbg[6], brbg[11]))(51)[-1])
类似地,使用您选择的 viridis
和 magma
调色板,您可以尝试找到它们之间的相似性。这可能是一个点,在哪里背靠背加入调色板。
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.
我发现 Kenneth Moreland's proposal 很有用。它现在已在 heatmaply
:
cool_warm
# install.packages("heatmaply")
img(heatmaply::cool_warm(500), "Cool-warm, (Moreland 2009)")
已经有一些好的和有用的建议,但让我补充几点:
- viridis 和 magma 调色板是具有多种色调的连续调色板。因此,沿着比例尺,您可以从非常浅的颜色增加到相当深的颜色。同时色彩度增加,色调从黄色变为蓝色(通过绿色或通过红色)。
- 可以通过组合两个顺序调色板来创建发散调色板。通常,您以浅色加入它们,然后让它们分叉成不同的深色。
- 通常,人们使用从中性浅灰色到两种不同深色的单色调连续调色板。应该注意的是,不同的 "arms" 调色板在亮度(明暗)和色度(色彩)方面是平衡的。
因此,将magma和viridis结合起来效果不佳。你可以让它们从类似的淡黄色发散,但你会发散到类似的淡蓝色。此外,随着色调的变化,判断您属于调色板的哪一臂会变得更加困难。
正如其他人所提到的,ColorBrewer.org 提供了很好的发散调色板。 Moreland 的方法也很有用。另一个通用解决方案是 colorspace
包中的 diverging_hcl()
函数。在 https://arxiv.org/abs/1903.06490(即将在 JSS 中发表)的随附论文中,描述了构造原则以及基于 HCL 的一般策略如何近似来自 ColorBrewer.org、CARTO 等的众多调色板。
(较早的参考资料包括我们在 http://dx.doi.org/10.1016/j.csda.2008.11.033 and further recommendations geared towards meteorology, but applicable beyond, in a BAMS paper at http://dx.doi.org/10.1175/BAMS-D-13-00155.1 的 CSDA 中的初步工作。)
我们在 HCL space(色调-色度-亮度)中的解决方案的优势在于您可以相对轻松地解释坐标。它确实需要一些练习,但不像其他解决方案那样不透明。我们还提供了一个 GUI hclwizard()
(见下文),有助于理解不同坐标的重要性。
问题中的大多数调色板和其他答案都可以与 diverging_hcl()
相当接近地匹配,前提是两种色调(参数 h
)、最大色度(c
), 和 minimal/maximal 亮度 (l
) 被适当地选择。此外,可能需要调整 power
参数,该参数分别控制色度和亮度增加的速度。通常,色度增加得相当快 (power[1] < 1
),而亮度增加得较慢 (power[2] > 1
)。
Moreland 的 "cool-warm" 调色板使用蓝色 (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 = 20
对比 l = 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 调色板可能取决于您的个人品味,但更重要的是,还取决于您想要在可视化中展现的内容。如果偏差的 符号 最重要,冷暖中的低亮度对比度将更有用。如果要显示(极端)偏差的 size,高亮度对比度会更有用。上面的论文提供了更实用的指导。
上图的其余复制代码为:
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")
最后,您可以在闪亮的应用程序中以交互方式探索我们推荐的颜色: http://hclwizard.org:64230/hclwizard/。对于 R 的用户,您还可以在您的计算机上本地启动 shiny 应用程序(运行s 比我们的服务器快一些)或者您可以 运行 它的 Tcl/Tk 版本(它甚至更快):
colorspace::hclwizard(gui = "shiny")
colorspace::hclwizard(gui = "tcltk")
如果您想了解调色板路径在 RGB 和 HCL 坐标中的样子,colorspace::specplot()
很有用。例如参见 [=36=].
scico
package (Palettes for R based on the Scientific Colour-Maps ) has several good diverging palettes that are perceptually uniform and colorblind safe (e.g., vik
, roma
, berlin
).
也可用于 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. Its colormaps are available in R via the pals
package or the 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)
Viridis 现在提供 cividis 色带,它基本上是发散色带。也是their recommended color ramp。