Matplotlib专题_配色,图表配色基础篇
博文已很长时间没有更新,不是因为新冠疫情,而是因为老家有一块宅基地,想建一个度假草堂,当然要自己动手设计,就集中精力去研究了一下Chief Architecture,算是在 Matplotlib 探索的旅途中被路边的一朵小花分散了注意力!
言归真传!
当我们掌握了matplotlib绘图的基本流程,能够绘制一些简单的图表时,就会想要让自己的图表具有丰富的色彩–即给图表配色。”食、色,性也!“
我将用一个专题系列文章来讨论matplotlib的配色功能。
配色是一个复杂的话题,涉及到数据理解、色彩学、美学等,但我们应该先从最基本的,如何为图表元素指定颜色开始。
在Matplotlib中,要为图表元素,如线条、文字、坐标轴等指定颜色,有两种方法:
- 直接使用matplotlib能够识别的颜色定义格式,如某个颜色集中的颜色名称或名称的简写、十六进制的颜色定义字符串、RGB值元组。 这是基础。
- 使用colormap,将数据映射为颜色模型。
Matplotlib可以识别 9 种格式定义的颜色,可以直接将这些格式的颜色定义赋值给绘图元素的color参数。
下面将依次结合实例详解它们:
1. 使用RGB值的浮点数元组
浮点数表示R、G、B值元组,如:(0.7, 0.2, 0.3)。
标准的RGB值是[0, 255] 区间的十进制整数,在matplotlib则是[0, 1]区间的浮点数,就是做区间 [0, 255] 到 区间 [0, 1] 的线性变换:
变换函数:
f
(
x
)
=
a
×
x
+
b
f(x) = a \times x + b
f(x)=a×x+b
f ( x ) = 1 v m a x − v m i n × x − v m i n v m a x − v m i n f(x) = \frac{1}{vmax-vmin} \times x - \frac{vmin}{vmax - vmin} f(x)=vmax−vmin1×x−vmax−vminvmin
在这里vmax = 255, vmin=0
,即RGB值除以255就是matplotlib可以识别的色彩浮点数元组。
这个概念很重要,进阶部分的 colormap,Normalize,实际上都是基于这个思想。
%matplotlib inline
import math
import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
fig = plt.figure()
plt.axes()
x = np.arange(0, 2*math.pi, 0.001)
y = np.sin(x)
plt.plot(x, y, color=(0.7,0.2,0.3)) #RGB值的浮点数元组
#与plt.plot(x, y, color=(178/255, 51/255, 77/255)) 等效
plt.show()
2. 十六进制颜色值字符串
上述十进制整数表示的RGB值可以用十六进制字符串表示,如:#FF7F0E,与 (225,127,14)是相同的颜色。
%matplotlib inline
import math
import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
fig = plt.figure()
plt.axes()
x = np.arange(0, 2*math.pi, 0.001)
y = np.sin(x)
plt.plot(x, y, color='#FF7F0E') #十六进制表示 的颜色
plt.show()
3. 简写的十六进制颜色字符串
相当于通过复制每个字符获得的十六进制RGB或RGBA字符串,例如,“# abc“ 相当于 “# aabbcc“,”#abcd” 相当于 “#aabbccdd”。
**注意:**这是matplotlib 3.2开始新增的功能,如果你这样使用遇到错误,请检查你的matplotlib版本。
import math
import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
fig = plt.figure()
plt.axes()
x = np.arange(0, 2*math.pi, 0.001)
y = np.sin(x)
plt.plot(x, y, color='#f4f') #十六进制的简写
plt.show()
4. 灰度
用一个[0, 1]区间的浮点数表示的灰度,例如’0.5’;0代表黑色,1代表白色,0.5表示 中等灰度;
%matplotlib inline
import math
import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
fig = plt.figure()
plt.axes()
x = np.arange(0, 2*math.pi, 0.001)
y = np.sin(x)
plt.plot(x, y, color='0.4') #灰度值
plt.show()
5. 八个基本色名称的首字母
8个常用颜色英文名称的首字母表示颜色名称简写,{'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'}
,分别是:蓝色blue、绿色green、红色red、青色cyan、品红magenta、黄色yellow、黑色black和白色white。
%matplotlib inline
import math
import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
fig = plt.figure()
plt.axes()
x = np.arange(0, 2*math.pi, 0.001)
y = np.sin(x)
plt.plot(x, y, color='m') #8个常用颜色的首字母
plt.show()
6. X11/CSS4颜色集的名称
一个被称为“X11”颜色集中颜色的名称,该颜色集是HTML设计重要的颜色名称及其定义。在matplotlib中以字典的形式保存了该颜色集的定义,颜色名称是字典的keys, 定义颜色的十六进制值是对应的values。
调用matplotlib.colors模块中的 CSS4_COLORS
字典可以输出该颜色集,共有148种颜色。
import matplotlib as mpl
mpl.colors.CSS4_COLORS
%matplotlib inline
import math
import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
fig = plt.figure()
plt.axes()
x = np.arange(0, 2*math.pi, 0.001)
y = np.sin(x)
plt.plot(x, y, color='burlywood')
plt.show()
7. xkcd颜色集
xkcd color survey颜色名称,带有前缀’xkcd:’,不区分大小写,例如:xkcd:sky blue
。xkcd色彩集是通过网络调查,搜集整理的954种颜色名称和对应的十六进制值。
matplotlib在colors模块的XKCD_COLORS
字典中保存了该颜色集的全部名称和对应的定义颜色的十六进制值。
%matplotlib inline
import math
import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
fig = plt.figure()
plt.axes()
x = np.arange(0, 2*math.pi, 0.001)
y = np.sin(x)
plt.plot(x, y, color='xkcd:tea')
plt.show()
8. Tableau 调色板
Tableau是一个数据分析软件,它有一个10分类的调色板(‘T10’ categorical palette)用于为图表配色(默认色环):insensitive):
{'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan'}
,
Matplotlib支持该调色板的颜色,不区分大小写。
matplotlib在colors模块的TABLEAU_COLORS
字典中保存了该调色板的颜色名称和对应的定义颜色的十六进制值。
%matplotlib inline
import math
import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
fig = plt.figure()
plt.axes()
x = np.arange(0, 2*math.pi, 0.001)
y = np.sin(x)
plt.plot(x, y, color='tab:purple')
plt.show()
9. "CN"颜色定义
“CN"颜色定义。
matplotlib.rcParams['axes.prop_cycle']
参数定义了一个cycler(循环器)。该参数存储了10种常用的颜色,可以通过索引循环调用。
‘C’后面跟一个数字,这个数字是颜色在色彩环中的索引,如果色环中不包括这个颜色,默认是黑色,
关于cycler,请参见 https://matplotlib.org/cycler/。
%matplotlib inline
import math
import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
fig = plt.figure()
plt.axes()
x = np.arange(0, 2*math.pi, 0.001)
y = np.sin(x)
plt.plot(x, y, color='C2')
plt.show()
总结
matplotlib配色功能很强大,最基本的就是简单、直接地给图表元素指定一个颜色。这些颜色的名称、格式当然应该是matplotlib支持的颜色格式。
matplotlib 3.2.0支持上述 9 种格式的颜色定义。
为了便于大家查阅和使用其中的颜色集,我提供了一个"list of named colors.ipynb",它列出了上面提到的颜色集的颜色名称、定义值、直观的颜色条,有需要的可以到 Python草堂群:457079928 下载。
部分截图如下:
下一篇,我们将讨论 matplotlib 更高级的配色功能,颜色映射 colormap。