7.6使用颜色表
用颜色来编码数据会极大地影响观察者对可视化图形的理解,因为观察者们对不同颜色及其要表达的信息总会有一个直觉的假设。
其实,用颜色为数据添加额外的信息是件好事情。如果知道什么时候应该选用什么颜色就再好不过了。
7.6.1 准备工作
如果你的数据不是自然地用颜色标示的(如地形/地势海拔或者物体的温度),那么最好不要人为地把它映射到自然色上。我们希望读者能恰当地理解数据,就需要选择一种能让读者容易理解的颜色。如果要展示与温度无关的财务数据,那么我们当然不希望读者把数据映射到表示温度的颜色上去。
如果数据与红色或绿色没有很强的关联时,要尽可能地避免使用这两种颜色。
为了帮助读者选择合适的颜色映射,我们将解释matplotlib包中已有的一些颜色表。如果你了解了这些颜色表的用途,并且知道从哪里找到它们,会对你很有帮助,并且会节省很多时间。
颜色表一般可以归为以下几类。
¡Sequential:表示同一颜色从低饱和度到高饱和度的两个色调的单色颜色表,例如从白色到天蓝色。对大多数情况来说这是理想的,因为这些颜色清晰地显示了颜色值从低到高的变化。
¡Diverging:表示中间值,是颜色的中值(通常是一些明亮的颜色),然后颜色范围在高和低两个方向上变化到两个不同的色调。这对于有明显中值的数据是理想的。例如,当中值是0时,颜色表能清晰地显示负值和正值之间的区别。
¡Qualitative:对于数据没有固定的顺序,并且想要轻易地区分开不同种类的数据,可以选用该颜色表。
¡Cyclic:当数据可以围绕端点值显示的时候,用该颜色表非常方便,例如表示一天的时间、风向或者相位角。
matplotlib自带许多预定义的颜色表,我们可以把它们划分为几类。我们会为何时使用何种颜色表给出一些建议。最基本且常用的颜色表有
autumn、bone、cool、copper、flag、gray、hot、hsv、jet、pink、prism、sprint、summer、winter和spectral。
在Yo r i c k科学可视化包中还有其他一些颜色表。这是从GIST包演变而来的,因此该集合中的所有颜色表名字中都有一个gist_前缀。
Yo r i c k科学可视化包是一个由C编写的解释型语言,最近不是非常活跃。我们可以在其官网中得到更多的信息。
这些颜色表集合包括以下表:gist_earth、gist_heat、gist_ncar、gist_rainbow和gist_stern。
下面介绍基于ColorBrewer的颜色表,它们可以分为以下几类。
¡Diverging:中间亮度最高,向两端递减。
¡Sequential:亮度单调地递减。
¡Qualitative:用不同种类的颜色来区分不同的数据类别。
另外还有一些可用的颜色表,如表7-1所示。
这里展示的大多数颜色表都可以通过在颜色表名字后面加上_r后缀进行反转,例如hot_r是反向循环的hot颜色表。
7.6.2 操作步骤
在matplotlib中我们可以为许多项目设置颜色表。例如,颜色表可以设置在image, pcolor和scatter上。我们可以通过cmap函数调用时传入的参数来设置颜色表。该参数是colors.Colormap的预期实例。
我们也可以使用matplotlib.pyplot.set_cmap为绘制在坐标轴上的最新的对象设置cmap。
通过matplotlib.pyplot.colormaps我们可以很容易地得到所有可用的颜色表。打开IPython,输入以下代码。
In [1]: import matplotlib.pyplot as plt
In [2]: plt.colormaps()
Out[2]:
['Accent',
'Accent_r',
'Blues',
'Blues_r',
...
'winter',
'winter_r']
注意,我们缩短了上面的输出列表,因为它包含了大约140个元素,会占用好几页。
上述代码将导入pyplot函数接口,并允许调用colormaps函数。colormaps函数会返回一个所有已注册颜色表的列表。最后,我们想向你展示如何创建一个美观的颜色表。在下面的例子中,我们需要进行以下操作。
(1)打开ColorBrewer网站,得到十六进制格式的diverging颜色表颜色值。
(2)生成随机样本x和y,其中y为所有值的累积和(模拟股票价格变动)。
(3)在matplotlib的散点图函数上做一些定制化。
(4)改变散点标记线条的颜色和宽度,使读者更容易理解。
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
# Red Yellow Green divergent colormap
red_yellow_green = ['#d73027', '#f46d43', '#fdae61',
'#fee08b', '#ffffbf', '#d9ef8b',
'#a6d96a', '#66bd63', '#1a9850']
sample_size = 1000
fig, ax = plt.subplots(1)
for i in range(9):
y = np.random.normal(size=sample_size).cumsum()
x = np.arange(sample_size)
ax.scatter(x, y, label=str(i), linewidth=0.1,
edgecolors='grey',
facecolor=red_yellow_green[i])
ax.legend()
plt.show()
上述代码将渲染出一个漂亮的图表,如图7-8所示。
内容来源:异步社区;版权属【人民邮电出版社 异步社区】所有,转载已获得授权;未经授权,不得以任何方式复制和传播本书内容,如需转载请联系异步社区。