在matplotlib中,默认存在一个颜色的自动映射机制,当我们绘制多条直线时,会通过这个颜色映射机制来为每条直线赋予不同的颜色,代码如下 import matplotlib.pyplot as plt import numpy as np x
在matplotlib中,默认存在一个颜色 的自动映射机制,当我们绘制多条直线时,会通过这个颜色映射机制来为每条直线赋予不同的颜色,代码如下
>>> import matplotlib.pyplot as plt>>> import numpy as np
>>> x = np.linspace(0, 3 * np.pi, 50)
>>> offsets = np.linspace(0, 2 * np.pi, 4, endpoint=False)
>>> for i in range(6):
... y = np.sin(x) + i
... plt.plot(x, y)
...
>>> plt.show()
输出结果如下
具体是如何实现这个功能的呢?其实是通过axes.prop_cycle这个属性,该属性用于设置一些基本的属性映射,默认情况下,设置了颜色的自动映射
>>> import matplotlib>>> matplotlib.rcParams['axes.prop_cycle']
cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'])
可以看到,默认的映射属性为颜色,然后对应了一系列的颜色梯度,当我们绘制多条颜色时,每条直线的颜色对应该颜色梯度中的一个具体颜色。当线条个数超出了颜色梯度的范围时,会自动循环利用,代码如下
>>> import matplotlib.pyplot as plt>>> import numpy as np
>>> x = np.linspace(0, 3 * np.pi, 50)
>>>
>>> offsets = np.linspace(0, 2 * np.pi, 4, endpoint=False)
>>> for i in range(20):
... y = np.sin(x) + i
... plt.plot(x, y)
...
>>> plt.show()
输出结果如下
可以看到,超过10条之后,线条的颜色出现了循环重复。通过cyler模块,我们可以自定义这样的属性循环,用法如下
>>> from cycler import cycler>>> custom_cycler = cycler(color=['c', 'm', 'y', 'k'])
>>> fig, ax = plt.subplots()
>>> ax.set_prop_cycle(custom_cycler)
>>> x = np.linspace(0, 3 * np.pi, 50)
>>> offsets = np.linspace(0, 2 * np.pi, 4, endpoint=False)
>>> for i in range(6):
... y = np.sin(x) + i
... ax.plot(x, y)
...
>>> plt.show()
上述代码通过Cycler定义了颜色的循环,然后通过set_prop_cycle将该颜色循环添加到特定的axes对象上,输出结果如下
其实,该循环可以定义的属性很多,颜色,线条宽度,线条样式等常用属性都可以进行定义,而且不同的循环还可以进行叠加,代码如下
>>> from cycler import cycler>>> custom_cycler = cycler(cycler(color=['c', 'm', 'y']) + cycler(linestyle=['-', '--', ':']))
>>> fig, ax = plt.subplots()
>>> ax.set_prop_cycle(custom_cycler)
>>> x = np.linspace(0, 3 * np.pi, 50)
>>> offsets = np.linspace(0, 2 * np.pi, 4, endpoint=False)
>>> for i in range(6):
... y = np.sin(x) + i
... ax.plot(x, y)
...
>>> plt.show()
当多个循环相加时,必须保证其长度相同,上述代码中每个属性的梯度长度都为3,输出结果如下
通过cycler为相同元素添加属性的自动映射,极大提高了绘图效率。
·end·
一个只分享干货的
生信公众号