2019-12-03 更新:根据反馈,新默认调色板已调整,因此新的“洋红色”略微偏红且更暗,而新的“黄色”略微偏浅且更亮。前者是为了提高“蓝色”和“洋红色”对红绿色盲患者的可辨别性,后者是为了提高“绿色”和“黄色”对红绿色盲患者的可辨别性。我们要感谢那些对新调色板提供反馈和建议的人,特别是 Antonio Camargo、Brenton Wiernik、Ken Knoblauch 和 Jakub Nowosad。
在 R 中,可以通过多种方式指定颜色:按名称,col = "red"
;按十六进制代码,col = "#FF0000"
;或按数字,col = 2
。最后一种,即数字颜色规范,是“颜色调色板”中的数字索引,该调色板通过 palette()
函数控制。此函数不带任何参数时,将返回当前调色板颜色集;正如我们所见,默认调色板中的第二种颜色是 "red"
,因此 col = 2
对应于红色。
palette()
## [1] "black" "red" "green3" "blue" "cyan" "magenta" "yellow"
## [8] "gray"
不幸的是,此默认颜色调色板有一个重大问题:它很糟糕。这些颜色高度饱和(花哨、艳丽),并且亮度差异很大(例如,"yellow"
比 "blue"
亮得多)。
此帖子介绍了 R 的新默认颜色调色板,描述了它的选择方式,并演示了颜色调色板功能的一些新扩展。简而言之,新调色板使用了类似的色调,但在亮度方面更加平衡,并且避免了极其艳丽的颜色。
选择新调色板
使用以下标准来选择新颜色调色板
调色板应遵循与旧调色板相同的基本模式:黑色、红色、绿色、蓝色、青色、洋红色、黄色和灰色。这主要是为了向后兼容,特别是文档。如果某个图形使用
col = 2
并且随附的文本将其称为红色,那么它不应与新调色板完全不符。除了色调外,调色板中的色度(色彩)和亮度(明暗)也可能有所不同,以使颜色更加分明,但差异不应太大。这是为了避免一种颜色比另一种颜色具有更大的视觉冲击力。
该调色板适用于为白色背景上的点和线着色。这意味着这些颜色应该相对较深且鲜艳。
调色板中的颜色应该明显可辨,包括对色觉缺陷的观察者,特别是最常见的两种红绿色觉缺陷:红绿色盲和红绿色弱(https://en.wikipedia.org/wiki/Color_blindness)。
我们在 HCL(色调-色度-亮度)颜色模型中工作,该模型试图捕捉人类色觉系统的感知维度。此颜色模型还用于最近添加的函数 grDevices::hcl.colors() 中,该函数受 colorspace 包启发,为基础 R 带来了广泛的定性、顺序和发散调色板。有关使用 HCL 颜色模型获取调色板的更多详细信息,请参阅随附的 arXiv 论文 和 http://colorspace.R-Forge.R-project.org/。
上述标准将新调色板限制在特定的色调、色度和亮度范围内,并使用 Polychrome 包中的函数生成潜在的颜色集并测量它们之间的视觉差异。有关更多详细信息,请参阅随附的 JSS 论文。
应用了一些最终的手动调整来平衡调色板的目标。除了新的默认调色板外,还提供了其他各种平衡的调色板作为备选方案(包括来自 ggplot2、ColorBrewer 和 Tableau 等的调色板)。
演示新调色板
按数字指定颜色并不特别常见,但它是一种在示例中演示颜色使用的简单方法,因此在 R 文档中多次出现。此外,在向单色图中添加几行时,按数字选择颜色也并不少见(例如,plot.lm
中的诊断散点图)。新的预定义调色板还使数字颜色规范的使用成为一种更明智、更有效的选择。
以下图像显示了使用 symbols()
帮助页中的示例,旧调色板的结果有多差,新调色板的结果有多好。这里选择此示例是因为温度计符号将着色线与阴影区域结合在一起。因此,下图展示了这两个方面(基于随机输入数据)。
在旧调色板中,颜色 5 和 7 要亮得多,因此相应的符号更难阅读,并与白色背景融为一体。相比之下,新调色板赋予所有符号相似的感知权重。
此外,以下图像模拟了两种调色板在红绿色盲和红绿色弱情况下的外观(使用 ‘colorspace’ 包 中的 deutan()
和 protan()
)。例如,请注意使用新调色板后,颜色 1 和 2 之间以及颜色 4 和 6 之间的可辨别性得到了提高。
新功能
还可以使用 palette()
函数设置新的调色板。可以通过向 palette()
指定一个参数来实现,该参数可以是颜色(颜色名称或十六进制颜色)的字符向量,也可以是指定预定义调色板名称的单个字符值。
以前,palette()
接受的唯一预定义调色板名称是 "default"
;这是恢复默认调色板的一种方法。但是,除了新的默认调色板之外,现在还支持各种新的预定义调色板名称。所有这些都已建立得很好,被广泛使用,并且基于有根据的构建原则和/或彻底的测试。
"R3"
是旧的默认调色板(为了与 R 版本 3.x.y 向后兼容)。"R4"
是新的默认调色板(与"default"
相同,从 R 版本 4.0.0 开始)。"Okabe-Ito"
是由 Masataka Okabe 和 Kei Ito 引入的一个成熟的调色板,非常适合色觉缺陷。"Accent"
、"Dark 2"
、"Paired"
、"Pastel 1"
、"Pastel 2"
、"Set 1"
、"Set 2"
和"Set 3"
都是流行的 ColorBrewer 制图配色集中的调色板(由 Mark A. Harrower 和 Cynthia A. Brewer 编写)。"ggplot2"
基于 Hadley Wickham 在 ggplot2 中引入的默认(基于色调)颜色比例。"Tableau 10"
和"Classic Tableau"
是流行的 Tableau 可视化软件中默认的调色板(由 Maureen Stone 和 Cristy Miller 编写)。"Polychrome 36"
和"Alphabet"
是 Polychrome 包(由 Kevin R. Coombes 和 Guy Brock 编写)中大量可区分的颜色集。
下面的色板显示了大多数预定义调色板(除了几个 ColorBrewer 调色板)的前八种颜色。请注意,其中一些调色板提供了更多颜色,特别是 "Polychrome 36"
和 "Alphabet"
,它们分别提供了 36 种和 26 种颜色。
为了促进采用这些新调色板,提供了两个新的配套函数
palette.pals()
返回预定义调色板的名称。palette.colors()
返回一个向量,其中包含预定义palette
中的n
种颜色,可以选择使用alpha
通道实现半透明。这允许直接使用新预定义调色板中的颜色与图形函数,而无需使用数字索引和palette()
函数。
palette.colors()
函数补充了 hcl.colors()
函数提供的定性调色板。hcl.colors()
函数提供了一些定性调色板,它们仅通过改变色调并保持色度和亮度固定,从而实现非常平衡的效果。虽然这在许多显示器中是理想的,但它会降低可辨别性,尤其是对于有色觉缺陷的观看者。这就是 palette.colors()
中的调色板允许在有限范围内出现色度和亮度差异的原因(如上所述)。
最后,另一个小小的改进是确保在没有打开任何图形设备时,调用 palette()
不会打开新的图形设备。
总结
R 中的默认 palette()
不再那么糟糕了。
几个新的预定义调色板和一个新的 palette.colors()
函数提供了一种明智且简单的方法,可生成一组可辨别的颜色,用于表示数据中的定性变化。
希望新的调色板不会搞乱对数字颜色规范的现有使用(尤其是在文档中),但我们很乐意听到任何问题(请发送电子邮件至 [email protected]
或 [email protected]
)。