前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >通过cycler实现属性的自动映射

通过cycler实现属性的自动映射

作者头像
生信修炼手册
发布2020-09-14 11:01:28
发布2020-09-14 11:01:28
65900
代码可运行
举报
文章被收录于专栏:生信修炼手册生信修炼手册
运行总次数:0
代码可运行

在matplotlib中,默认存在一个颜色 的自动映射机制,当我们绘制多条直线时,会通过这个颜色映射机制来为每条直线赋予不同的颜色,代码如下

代码语言:javascript
代码运行次数:0
运行
复制
>>> 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这个属性,该属性用于设置一些基本的属性映射,默认情况下,设置了颜色的自动映射

代码语言:javascript
代码运行次数:0
运行
复制
>>> import matplotlib
>>> matplotlib.rcParams['axes.prop_cycle']
cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'])

可以看到,默认的映射属性为颜色,然后对应了一系列的颜色梯度,当我们绘制多条颜色时,每条直线的颜色对应该颜色梯度中的一个具体颜色。当线条个数超出了颜色梯度的范围时,会自动循环利用,代码如下

代码语言:javascript
代码运行次数:0
运行
复制
>>> 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模块,我们可以自定义这样的属性循环,用法如下

代码语言:javascript
代码运行次数:0
运行
复制
>>> 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对象上,输出结果如下

其实,该循环可以定义的属性很多,颜色,线条宽度,线条样式等常用属性都可以进行定义,而且不同的循环还可以进行叠加,代码如下

代码语言:javascript
代码运行次数:0
运行
复制
>>> 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为相同元素添加属性的自动映射,极大提高了绘图效率。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信修炼手册 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档