概述
matplotlib 库是当前最为流行的数据可视化库,它支持相当多的颜色系统,
支持的颜色
RGB 或者 RBGA
可以传递三个到四个浮点数来指定 RGB 颜色或者 RGBA 颜色,例如 (0.1, 0.2, 0.5)
或者 (0.2, 0.5, 0.3, 0.2)
。
十六进制字符串
RGB 颜色或者 RGBA 颜色还可以使用基于十六进制的字符串,例如 #0f0f0f
或者 #0f0f0f80
。
包含灰度级的浮点值的字符串
例如 0.5
。
一些基本颜色的单字符速记符号
用一些颜色的首字母作为颜色的速记符,例如:
-
'b'
如蓝色 -
'g'
作为绿色 -
'r'
作为红色 -
'c'
作为青色 -
'm'
洋红色 -
'y'
作为黄色 -
'k'
作为黑色 -
'w'
作为白色
- matplotlib 2.0 版本之后,默认颜色不再是之前的 ['b', 'g', 'r', 'c', 'm', 'y', 'k',...],所以使用 'b' 反而是奇怪的颜色,并不能调出默认颜色
#1f77b4
。详情见链接颜色变化- 为了与当前配色一致,可以使用
colors = ['C0', 'C1', 'C2', ...]
2.0 版本之后的颜色变化
X11/CSS4 颜色
不区分大小写的 X11/CSS4 颜色名称。例如 aquamarine
和 mediumseagreen
;具体颜色详情见 wiki
xkcd 颜色
自 xkcd 的不区分大小写的颜色名称,带有 'xkcd:'
前缀,例如 'xkcd:sky blue'
。
CN 颜色规范
使用 c0~cn
来指定颜色,它是默认属性循环的索引的颜色。
tab 分类调色盘的颜色
tab10分类调色板中的 Tableau 颜色,例如 'tab:blue'
。
Matplotlib 中 RGB 透明度计算公式:
示例
X11/CSS4 与 xkcd 颜色对比
完整代码如下:
import matplotlib.colors as mcolors
import matplotlib.patches as mpatch
import matplotlib.pyplot as plt
overlap = {name for name in mcolors.CSS4_COLORS
if f'xkcd:{name}' in mcolors.XKCD_COLORS}
fig = plt.figure(figsize=[9, 5])
ax = fig.add_axes([0, 0, 1, 1])
n_groups = 3
n_rows = len(overlap) // n_groups + 1
for j, color_name in enumerate(sorted(overlap)):
css4 = mcolors.CSS4_COLORS[color_name]
xkcd = mcolors.XKCD_COLORS[f'xkcd:{color_name}'].upper()
# Pick text colour based on perceived luminance.
rgba = mcolors.to_rgba_array([css4, xkcd])
luma = 0.299 * rgba[:, 0] + 0.587 * rgba[:, 1] + 0.114 * rgba[:, 2]
css4_text_color = 'k' if luma[0] > 0.5 else 'w'
xkcd_text_color = 'k' if luma[1] > 0.5 else 'w'
col_shift = (j // n_rows) * 3
y_pos = j % n_rows
text_args = dict(fontsize=10, weight='bold' if css4 == xkcd else None)
ax.add_patch(mpatch.Rectangle((0 + col_shift, y_pos), 1, 1, color=css4))
ax.add_patch(mpatch.Rectangle((1 + col_shift, y_pos), 1, 1, color=xkcd))
ax.text(0.5 + col_shift, y_pos + .7, css4,
color=css4_text_color, ha='center', **text_args)
ax.text(1.5 + col_shift, y_pos + .7, xkcd,
color=xkcd_text_color, ha='center', **text_args)
ax.text(2 + col_shift, y_pos + .7, f' {color_name}', **text_args)
for g in range(n_groups):
ax.hlines(range(n_rows), 3*g, 3*g + 2.8, color='0.7', linewidth=1)
ax.text(0.5 + 3*g, -0.3, 'X11/CSS4', ha='center')
ax.text(1.5 + 3*g, -0.3, 'xkcd', ha='center')
ax.set_xlim(0, 3 * n_groups)
ax.set_ylim(n_rows, -1)
ax.axis('off')
plt.show()
画图结果如下:
CN 颜色选择
Matplotlib 在绘制时将 CN 颜色转换为 RGBA。完整代码如下:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
th = np.linspace(0, 2*np.pi, 128)
def demo(sty):
mpl.style.use(sty)
fig, ax = plt.subplots(figsize=(3, 3))
ax.set_title('style: {!r}'.format(sty), color='C0')
ax.plot(th, np.cos(th), 'C1', label='C1')
ax.plot(th, np.sin(th), 'C2', label='C2')
ax.legend()
demo('default')
画图结果如下:
综合示例
import matplotlib.pyplot as plt
import numpy as np
t = np.linspace(0.0, 2.0, 201)
s = np.sin(2 * np.pi * t)
# 1) RGB tuple:
fig, ax = plt.subplots(facecolor=(.18, .31, .31))
# 2) hex string:
ax.set_facecolor('#eafff5')
# 3) gray level string:
ax.set_title('Voltage vs. time chart', color='0.7')
# 4) single letter color string
ax.set_xlabel('Time [s]', color='c')
# 5) a named color:
ax.set_ylabel('Voltage [mV]', color='peachpuff')
# 6) a named xkcd color:
ax.plot(t, s, 'xkcd:crimson')
# 7) Cn notation:
ax.plot(t, .7*s, color='C4', linestyle='--')
# 8) tab notation:
ax.tick_params(labelcolor='tab:orange')
plt.show()
画图结果如下:
往期回顾
- 【matplotlib】可视化解决方案——如何实现画布局部放大功能
- 【matplotlib】可视化解决方案——如何更改matplotlib配置信息
- 【matplotlib】可视化解决方案——如何定制化网格
- 【matplotlib】可视化解决方案——如何向画布添加交叉直线
- 【matplotlib】可视化解决方案——如何解决matplotlib中文乱码问题
- 【matplotlib】可视化解决方案——如何设置matplotlib风格集
- 【matplotlib】可视化解决方案——如何设置轴标签的透明度和大小
- 【matplotlib】可视化解决方案——如何向图表中添加数据表
- 【matplotlib】可视化解决方案——如何更改绘图区域背景颜色
- 【matplotlib】可视化解决方案——如何使用数学公式
文中难免会出现一些描述不当之处(尽管我已反复检查多次),欢迎在留言区指正,相关的知识点也可进行分享,希望大家都能有所收获!!如果觉得我的文章写得还行,不妨支持一下。你的每一个转发、关注、点赞、评论都是对我最大的支持!