# 使用颜色

# 在数据可视化中,颜色通常被用于编码数据的分类或定序属性(例如受教育程度,文盲或半文盲为 1, 小学为 2 ······)。图表使用颜色时应遵循一定的基本规则,既要避免使用过多的颜色,又要避免随意使用颜色,否则会直接影响可视化的效果且不易让人理解。合理地使用颜色可以参考以下规则 :

# 广泛的色调和亮度范围。
遵循自然的颜色模式。
尽量使用渐变颜色,而不是选择一组静态颜色。

# matplotlib 内置了一些表示单一颜色的基础颜色和表示一组颜色的颜色映射表。下面将对颜色的使用方式进行详细介绍。

# 使用基础颜色

# matplotlib 的基础颜色主要有 3 种表示方式 :单词缩写或单词、十六进制或 HTML 模式、RGB 模式,具体介绍如下。

# 单词缩写或单词表示的颜色

# matplotlib 支持使用单词缩写或单词表示的 8 种颜色:青色、洋红色、黄色、黑色、红色、绿色、蓝色、白色。每种颜色的表示方式及说明如表 4-2 所示。

image

# 十六进制或 HTML 模式表示的颜色

# matplotlib 支持使用十六进制或 HTML/CSS 模式表示更多的颜色,它将这些颜色存储在colors.cnames 字典中,可通过访问 colors.cnames 字典查看全部的颜色,示例代码及运行结果如下。

In [3]: for name, hex in matplotlib.colors.cnames.items() :
            print(name, hex)
Out [3]:
aliceblue #F0F8FF
antiquewhite #FAEBD7
aqua #00FFFF
aquamarine #7FFFD4
azure #F0FFFF
beige #F5F5DC
bisque #FFE4C4
black #000000
...省略N行...
whitesmoke #F5F5F5
yellow #FFFF00
yellowgreen #9ACD32

# 由以上运行结果可知,cnames 字典的键为 HTML 模式的颜色字符串,值为十六进制的颜色字符串。

# RGB 模式表示的颜色

# matplotlib 支持使用 RGB 模式的三元组表示颜色,其中元组的第 1 个元素代表红色值,第 2 个元素代表绿色值,第 3 个元素代表蓝色值,且每个元素的取值范围均是[0,1], 示例代码如下:

color = (0.3, 0.3, 0.4)

# 以上 3 种方式表示的颜色都可以传入 matplotlib 带有表示颜色的 color 或 c 参数的不同函数或方法中,从而为图表的相应元素设置颜色。例如,分别用3种方式将线条的颜色设为绿色,代码如下。

# 第 1 种方式
plt.plot([1, 2, 3], [3, 4, 5], color='g')
# 第 2 种方式
plt.plot([l, 2, 3], [3, 4, 5], color='#2E8B57')
# 第 3 种方式
plt.plot([1, 2, 3], [3, 4, 5], color=(0.0, 0.5, 0.0))

# 使用颜色映射表

# matplotlib 内置了众多预定义的颜色映射表,使用这些颜色映射表可以为用户提供更多的颜色建议,为用户节省大量的开发时间。pyplot 模块中提供了 colormaps() 函数用于查看所有可用的颜色映射表,示例代码及运行结果如下。

In [4]: plt.colormaps()
Out [4]:
['Accent',
'Accent_r',
'Blues',
'Blues_r',
...省略N行...
'viridis'
'viridis_r',
'winter',
'winter_r']

# 以上展示的颜色映射表的名称分为有 “_r” 后缀和无 “_r” 后缀两种,其中有 “_r” 后缀的颜色表相当于同名的无 “_r” 后缀的反转后的颜色表。假设颜色映射表 demo 包含的颜色顺序为 black、white、gray, 那么颜色映射表 demo_r 的颜色顺序为 gray、white、black。
颜色映射表能够表示丰富的颜色,常用映射表有 autumn、bone、cool、copper、flag、gray、hot、hsv、jet、pink、prism、sprint、summer、winter。为了让用户合理地使用颜色映射表,颜色映射表一般可以划分为以下 3 类。

# · Sequential :表示同一颜色从低饱和度到高饱和度的单色颜色映射表。
· Diverging :表示颜色从中间的明亮 色过渡到两个不同颜色范围方向的颜色映射表。
· Qualitative :表示可以轻易区分不同种类的数据的颜色映射表。

# 此外,开发人员可以自定义新的颜色映射表,再通过 matplotlib.cm.register_cmap() 函数将自定义的颜色映射表添加到 matplotlib。
matplotlib 主要有两种使用颜色映射表的方式:第一种方式是在调用函数或方法绘制图表或添加辅助元素时将颜色映射表传递给关键字参数 cmap;第二种方式是直接调用 set_cmap() 函数进行设置。这两种方式的具体用法如下。

# (1)使用关键字参数 cmap 的示例代码如下。

plt.scatter(x, y, c=np.random.rand(10), cmap=matplotlib.cm.jet)

# (2)使用 set_cmap() 函数的示例代码如下。

plt.set_cmap(matplotlib.cm.jet)

# 实例1:两个地区对不同种类图书的采购情况

# 高尔基说:“书籍是人类进步的阶梯J。”据统计韩国人年均阅读量为 7 本,日本人年均阅读量为 40 本。相比较而言,中国人的阅读量还有进步空间。已知地区 1 和地区 2 对各类图书的采购情况如表 4-3 所示。

image

# 根据表 4-3 的数据,将“图书种类”一列的数据作为 x 轴的刻度标签,将 “地区 1” 和 “地区 2” 两列数据作为 y 轴对应的两组数据,绘制反映地区 1 和地区 2 对各类图书的采购情况的堆积柱形图,并分别使用 “#FFCC00” 和 “#B0C4DE” 这两种颜色进行区分,具体代码如下。

In [5]:
# 01_book_purchase
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
x = np.arange(5)
y1 = [1200, 2400, 1800,2200, 1600]
y2 = [1050, 2100, 1300, 1600, 1340]
bar_width = 0.6
tick_label = ["家庭","小说","心理","科技","儿童"]
fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制柱形图,并使用颜色
ax.bar(x, y1, bar_width, color="#FFCC00", align="center", label="地区1”)
ax.bar(x, y2, bar_width, bottom=y1, color="#B0C4DE", align="center",
       label=”地区2”)
ax.set_ylabel("采购数量(本)")
ax.set_xlabel("图书种类")
ax.set_title("地区1和地区2对各类图书的采购情况")
ax.grid(True, axis='y', color="gray”,alpha=0.2)
ax.set_xticks(x)
ax.set__xticklabels(tick_label)
ax.legend()
plt.show()

# 运行程序,效果如图 4-1 所示。

image

# 图 4-1 中,每个柱形由两种不同颜色的矩形条堆积而成,其中上方的浅蓝色矩形条代表地区 2 的采购数量,下方的淡黄色矩形条代表地区 1 的采购数量。由图 4-1 可知,明亮的颜色给人轻快的感觉,而不同于之前的深色给人厚重的感觉。