“最佳”颜色系列,用于区分出版物质量图表中的系列


89

是否已进行过研究,以便在同一图上显示多个系列的最佳颜色是什么?我一直在使用中的默认值matplotlib,因为它们都是明亮的原色,所以它们看起来有点幼稚。


28
这不能回答您的问题,但是我认为必须提及。只要有可能,任何选择的配色方案都应补充不同的符号或线条样式,以便在以黑白方式打印图时仍易于理解。作者经常只依靠颜色,从而使数字对色盲以及那些喜欢阅读纸张的黑白印刷版的人毫无用处。如果可能,绘图应始终以黑白显示,并且颜色应“更好”。
WetlabStudent 2014年

11
+1到MHH。关于斯诺克的一段传奇电视评论间接地指出了同样的观点:“史蒂夫(Steve)想要粉红色的球-对于你们中那些黑白观看的人,粉红色紧挨着绿色。” 对年轻读者的解释:那是因为有些人买得起彩色电视机,而另一些人则不得不购买便宜的黑白电视机。
尼克·考克斯

5
“最佳”目的是什么?这不是一个小问题。为了打动互联网论坛的读者,我使用无颜色的图形符号,然后用彩虹色装饰它们(这可能很有意义,但主要是为了引起人们的注意并赋予其“质量”感)。对于打算传输数据的图,可能会选择另一种配色方案,而对于以探索方式创建的图,以揭示可能的意外图案(以视觉格式像),该图则应取决于目的:区分,汇总,选择,其他?
ub

2
@whuber:你说的很对。我应该明确指出,我打算在科学文献中发表论文,总的来说,我想问的是聚合,选择,分化等各个类别的答案。实际上,聚合和分化通常不是单独的目标:在图中从我的一篇论文(dx.doi.org/10.1063/1.4864755)中,我都需要(而且我认为我并没有做得很好)。(对不起那些不在大学校园中的人;我会尽快与公众建立联系)
David Hollman 2014年

Answers:


53

选择调色板的常见参考是Cynthia Brewer在ColorBrewer上的工作。颜色是根据Choropleth映射中的感知模式选择的,但是大多数相同的建议适用于在任何类型的图中使用颜色来区分数据模式。如果仅用颜色来区分不同的线条,则必须使用定性调色板。

在只有几条线的线图中,通常不需要颜色,并且不同的点符号和/或虚线图案足够有效。线图的一个更常见的问题是,如果线频繁重叠,则无论您使用什么符号或颜色,都很难区分不同的图案。斯蒂芬·科斯林(Stephen Kosslyn)建议一般的经验法则是在一个图中只包含4行。如果您有更多考虑,请考虑将线分成一系列小的多重绘图。这是显示建议的示例

不需要颜色,标签也绰绰有余。


4
我喜欢ColorBrewer的“ Dark2”调色板!
Gimelist,2014年

5
感谢您对ColorBrewer的推荐!那就是我一直在寻找的东西。
大卫·霍尔曼

如果在中间的某个地方(无法追溯到该两个系列之前)或在结尾处(标签无法区分哪个系列)有两个具有相同值的系列,则灰度图像不起作用系列是哪个)。它虽然有效,但很棒……
naught101 '16

同意@ naught101为中间(一致的两端只是将标签放在末尾之前的某处)。实际上不使用点之间的线性插值,而是使用某种样条线的原因之一。在这种情况下,样条曲线将沿不同方向弯曲。在密集的平行坐标图中,这种情况相当多。(抖动还可以帮助处理具有许多联系的数据,例如低整数计数的数据。)
Andy W

1
您对数据的评论即。亚马逊上的书令人难以置信。谢谢你
安迪W

40

在其他答案中,很多非常出色的好建议,但是这里有一些我自己对学生的低级建议。考虑到以下关键问题,自然而然地这只是建议:我的图形打算做什么?这些数据有什么意义?谁是读者群?我期望颜色在图表中做什么?无论其他人的教条如何,该图是否都能正常工作?

此外,颜色的重要性从一个图形到另一个图形变化很大。对于Choropleth或小块贴图,其中的想法确实是不同区域的颜色或阴影至少不同,图的成功与其配色方案的成功紧密相关。对于其他种类的图形,颜色可能是不必要的,甚至是令人讨厌的。

  1. 需要所有颜色吗?例如,如果在图形的不同区域中通过文本标签清楚地区分了不同的变量或组,那么单独的颜色也常常会被淘汰。当心水果沙拉或五颜六色的梦境效果。例如,对于在文本上或在文本切片上带有文本标签的饼图,颜色不会传达额外的信息。(如果饼图取决于键或图例,则您可能正在尝试使用错误的图形。)

  2. 切勿依靠红色和绿色之间的对比,因为许多人都难以区分这些颜色。

  3. 彩虹序列(ROYGBIV或红-橙-黄-绿-蓝-靛蓝-紫)可能会吸引身体,但在实践中效果不佳。例如,黄色通常是较弱的颜色,而橙色和绿色通常更强,因此印象甚至不是单调的序列。

  4. 避免使用任何会引起强烈的大色块的配色方案。

  5. 当需要有序序列时,从深红色到深蓝色的序列效果很好。如果白色(通常)是任何地方的背景颜色,请不要使用它,而应从浅红色跳到浅蓝色。[2018年3月1日新增]可能太明显了,无法强调:红色对许多人来说具有消极和/或危险的含义,这可能会有所帮助,而蓝色可能意味着积极的含义。下划线太明显了,但我可以做任何事情:红色和蓝色在许多国家中确实具有政治含义。

  6. 蓝色和橙色相处得很好(在此感谢Hastie,Tibshirani和Friedman的致意:http ://web.stanford.edu/~hastie/local.ftp/Springer/OLD/ESLII_print4.pdf )[2018年3月1日添加]许多现在,有关可视化的入门书籍推荐橙色,蓝色和灰色作为基本调色板:橙色和/或蓝色代表您关心的内容,灰色代表背景。

  7. 从浅灰色到深灰色的灰度可以很好地工作,并且在无法进行色彩还原时是个好主意。(这是一台糟糕的打印机,无法在灰度级上进行漂亮的打击。)(如果您愿意,则为灰色;看起来喜好在整个海洋中都在变化;就像颜色和颜色一样。)

  8. [2016年8月5日添加]一个相当普遍的原则是,两种颜色通常比许多颜色要好得多。如果两组都感兴趣,则选择同样强烈的颜色(例如红色或橙色和蓝色)。如果其中一组特别受关注,则将其设置为蓝色或橙色,然后将其他设置为灰色。原则上将7种颜色用于7组可以承载信息,但是即使在与其他几种颜色竞争的情况下,也很难集中于一种颜色。对于多个组而言,小倍数可能比多色图更好。


1
关于弱和强色彩的很好观点
Shadowtalker'Oct 8'2014

2
第二点非常重要。我的一位统计老师是色盲的,在图表中愉快地使用了“浅黄色”和“浅绿色黄色”。颜色实际上与我们相同,但对他来说,它们很容易被辨认。
Christian Sauer 2014年

1
感谢您的提示,尤其是#2。我回头看了看情节,意识到红色和绿色是matplotlib总是选择的前两种颜色。那不是很好。
大卫·霍尔曼

这似乎是一个愚蠢的默认设置。
尼克·考克斯

27

近年来,实际上对此进行了大量研究。

重点是“语义共鸣”。从根本上讲,这意味着“与它们代表的颜色相对应的颜色”,例如,至少对于美国的受众而言,金钱的时间序列应涂成绿色。这显然提高了理解力。Lin等人(2013)撰写了一篇有关该主题的非常有趣的论文:http : //vis.stanford.edu/papers/semantically-resonant-colors

http://tools.medialab.sciences-po.fr/iwanthue/上还有一个非常不错的iWantHue颜色生成器,其他选项卡中有很多信息。

参考文献

Lin,Sharon,Julie Fortuna,Chinmay Kulkarni,Maureen Stone和Jeffrey Heer。(2013)。选择语义共振的颜色以进行数据可视化。计算机图形学论坛(Proc。EuroVis),2013年


13
+1 ...但是,有些事情(例如您的金钱榜样)并不普遍。在美国,金钱可能是绿色的。它并非到处都是绿色,并且颜色的关联因国家/地区而异(例如,德国的某人可能更倾向于将蓝色与金钱相关联,尽管如今它趋向于具有多种颜色)。
Glen_b 2014年

@Glen_b好点
Shadowtalker

1
+1引用论文,最能说明问题的前三个单词:-)
David Hollman,2014年

22

Paul Tol在其网站上提供了针对色差(即分类或定性数据)和色盲视觉优化的配色方案,并在与该链接相关的“技术说明”(PDF文件)中提供了详细信息。他说:

为了尽可能清晰地显示具有科学结果的图形,可以方便地使用以下调色板:

  • 适合所有人,包括色盲读者;
  • 有别于黑白
  • 在屏幕和纸张上截然不同;和
  • 仍然搭配得很好。

我从他的“调色板1”中选择了9种最明显的颜色,然后将其放在我的matplotlibrc文件下axes.color_cycle

axes.color_cycle    : 332288, 88CCEE, 44AA99, 117733, 999933, DDCC77, CC6677, 882255, AA4499

然后,从Joe Kington的答案中借用以下默认线:

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np

x = np.linspace(0, 20, 100)

fig, axes = plt.subplots(nrows=2)

for i in range(1,10):
    axes[0].plot(x, i * (x - 10)**2)

for i in range(1,10):
    axes[1].plot(x, i * np.cos(x))

plt.show()

结果是:

在此处输入图片说明

对于发散色图(例如,表示标量值),我见过的最好的参考文献是肯尼思·莫兰德(Kenneth Moreland)的论文,可在此处找到“发散色图以实现科学可视化 ”。他开发了冷暖方案来代替Rainbow方案,并“提出了一种算法,可以使用户轻松生成自己的自定义颜色图”。

关于在科学可视化中使用颜色的信息的另一个有用资源来自罗伯特·西蒙(Robert Simmon),他为NASA创建了“蓝色大理石”图像。在地球观测网站上查看他的系列文章


6
+1(9)中回答唯一的(!)答案实际上是显示颜色的,以回答有关“最佳颜色”的问题。
变形虫

@amoeba:好了,不再了:-)

20

colorbrewer2.org你可以找到定性的连续的发散的配色方案。定性最大化了连续颜色之间的差异,这就是我在gnuplot中使用的颜色。该站点的优点是您可以轻松复制颜色的十六进制代码,以便轻松导入。例如,我正在使用以下8色设置:

#e41a1c
#377eb8
#4daf4a
#984ea3
#ff7f00
#ffff33
#a65628
#f781bf

这是令人愉快的,并产生清晰的结果。

附带说明一下,当您需要平滑的坡度时,使用顺序;当您需要突出与中心值的差异(例如,山高和海深)时,请使用发散。您可以在此处阅读有关这些配色方案的更多信息。


1
我个人并不认为亮黄色是一种清晰的积点颜色
Rhombidodecahedron


5

我喜欢来自colorbrewer的Dark2调色板用于散点图。我们在ggobi图书www.ggobi.org/book中使用了此功能。但是除此之外,调色板是针对地理区域而不是数据图的。对于基于点的图,良好的颜色选择仍然是一个问题。

R软件包colorspacedichromat有用。colorspace可以选择方向盘周围的颜色:您可以花数小时/天进行微调。dichromat帮助检查色盲。

ggplot2 通常具有良好的默认值,尽管不一定需要色盲证明。

从红色到蓝色的方案在您的计算机上看起来不错,但投影效果不好。


3

另一种可能性是找到一组颜色,这些颜色是:a)在LAB中是等距的,b)考虑色盲,并且c)可以适合sRGB色域的色域以及最常见的CMYK空间的色域。

我认为对于任何一种颜色选择方法来说,最后一个要求都是必要的- 如果颜色在屏幕上看起来不错,但在CMYK流程中打印时颜色混乱,则没有任何好处。并且由于OP指定了“发布质量”,因此我假设图形的确将以CMYK打印。


3

是我最喜欢的方案。它具有20种(!!!!)不同的颜色,所有这些颜色都易于区分。但是,对于有色盲的人,它可能会失败。

#e6194b
#3cb44b
#ffe119
#0082c8
#f58231
#911eb4
#46f0f0
#f032e6
#d2f53c
#fabebe
#008080
#e6beff
#aa6e28
#fffac8
#800000
#aaffc3
#808000
#ffd8b1
#000080
#808080
#ffffff
#000000

2

绘制线条时,应注意绿色和黄色,它们在投影仪上不能很好地显示。由于我最终会在演示文稿中重复使用大部分绘图,因此即使原本打算用于屏幕或纸质出版物,我也避免使用这些颜色。

为了保持高对比度,我需要使用黑色,红色,蓝色,洋红色,青色,如果我真的需要它,可以使用灰色。实际上,其中大多数是明亮的原色或中间色。我知道从美学角度来看这可能不是最佳选择,但我对所呈现内容的清晰度更感兴趣。另一方面,从美学角度来看,始终如一地重用有限调色板中的相同颜色可能是一件好事。

如果使用的线条多于6条,则说明您要填满更多空间,并倾向于绘制彩色块。对于此类情节,我认为每种情况都需要单独考虑。您是否要突出极端或过零?您的数据是周期性的吗(例如0和2π应该使用相同的颜色)?是否有类似于温度的标准,例如蓝色/红色?白色代表NaN,没有数据,还是将其用作突出显示?等


2

对于色盲观看者来说,CARTOColors有一个定性的色盲友好方案Safe,该方案基于Paul Tol流行的色彩方案。此调色板包含12种易于区分的颜色。

另一种优质的色盲友好调色板是Okabe和Ito方案,他们在其文章“通用颜色设计(CUD):如何制作对色盲人士友好的图形和演示文稿”中提出了该方案。

### Example for R users
library(ggplot2)
library(rcartocolor)
library(patchwork)
theme_set(theme_classic(base_size = 14) + theme(panel.background = element_rect(fill = "#ecf0f1")))

set.seed(123)
df <- data.frame(x = rep(1:5, 8), 
                 value = sample(1:100, 40), 
                 variable = rep(paste0("category", 1:8), each = 5))

safe_pal <- carto_pal(12, "Safe")
palette_OkabeIto_black <- c("#E69F00", "#56B4E9", "#009E73", "#F0E442", 
                            "#0072B2", "#D55E00", "#CC79A7", "#000000")

# plot
p1 <- ggplot(data = df, aes(x = x, y = value)) + 
  geom_line(aes(colour = variable), size = 1) +
  scale_color_manual(values = palette_OkabeIto_black)


p2 <- ggplot(data = df, aes(x = x, y = value)) + 
  geom_col(aes(fill = variable)) +
  scale_fill_manual(values = safe_pal)

p1 / p2

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.