R 的新 palette()



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])。