matplotlib之属性组合包(cycler)的使用


Posted in Python onFebruary 24, 2021

matplotlib的依赖包cycler是matplotlib自主开发的属性组合包,功能与内置模块itertools很多函数非常相似,可用于创建特殊的迭代器。matpoltlib在属性设置底层中使用了cycler包,典型的案例就是在多数据系列绘图中循环使用颜色、线条等外观设置。使用cycler可以避免构造多重循环,更简便、灵活的组合属性。

cycler包概述

cycler包的API主要有三个:

  • cycler(*args, **kwargs):工厂函数,创建一个Cycler对象。cycler(*args, **kwargs)有三种调用方式:
    • cycler(arg):arg为Cycler对象。复制Cycler对象的构造函数。
    • cycler(label1=iter1[, label2=iter2[, ...]]):label必须是有效的Python标识符,要求类似字典的键,iter为可迭代对象。求多组参数的点积,功能类似于zip()函数。
    • cycler(label, itr):从一对label和可迭代对象构造Cycler对象。这里label可以为整数和带空格的字符串。
  • Cycler(left[, right, op]) :底层类。
  • concat(left, right) :拼接两个cycler对象。

基本功能

cycler的基本功能是方便的将一个可哈希的对象(hashable)与一系列值进行映射。
根据下面的例子可知,cycler对象可以将关键字参数名称与序列进行一一映射,cycler对象是一个迭代器,迭代输出的对象为字典结构,键为关键字参数名称,值为序列的元素。

In [1]: from cycler import cycler
In [2]: color_cycle = cycler(color=['r', 'g', 'b'])
In [3]: color_cycle
Out[3]: cycler('color', ['r', 'g', 'b'])
In [4]: len(color_cycle)
Out[4]: 3
In [5]: color_cycle.keys
Out[5]: {'color'}
In [6]: for i in color_cycle:
  ...:   print(i)
  ...:
{'color': 'r'}
{'color': 'g'}
{'color': 'b'}

cycler的基本功能与循环非常相似,cycler的强大在于创建复杂的属性组合。

加法运算(cycler对象相加)

两个cycler对象进行加法运算,相当于将两个对象的元素按次序一一组合,功能类似于Python内置的zip()函数。

In [1]: from cycler import cycler
In [2]: color_cycle = cycler(color=['r', 'g', 'b'])
In [3]: lw_cycle = cycler(lw=range(1, 4))
In [4]: wc = lw_cycle + color_cycle
In [5]: for s in wc:
  ...:   print(s)
  ...:
{'lw': 1, 'color': 'r'}
{'lw': 2, 'color': 'g'}
{'lw': 3, 'color': 'b'}
 
cycler函数传递多个关键字参数就相当于对这些参数进行加法运算
In [1]: from cycler import cycler
In [2]: wc = cycler(c=['r', 'g', 'b'], lw=range(3))
In [3]: for s in wc:
  ...:   print(s)
  ...:
{'c': 'r', 'lw': 0}
{'c': 'g', 'lw': 1}
{'c': 'b', 'lw': 2}

乘法运算(cycler对象相乘)

两个cycler对象进行乘法运算,相当于求两个对象的元素的笛卡尔积,功能类似于Python内置的itertools.product()函数。

In [1]: from cycler import cycler
In [2]: color_cycle = cycler(color=['r', 'g', 'b'])
In [3]: m_cycle = cycler(marker=['s', 'o'])
In [4]: m_c = m_cycle * color_cycle
In [5]: for s in m_c:
  ...:   print(s)
  ...:
{'marker': 's', 'color': 'r'}
{'marker': 's', 'color': 'g'}
{'marker': 's', 'color': 'b'}
{'marker': 'o', 'color': 'r'}
{'marker': 'o', 'color': 'g'}
{'marker': 'o', 'color': 'b'}

标量乘法运算(cycler对象与整数相乘)

cycler对象与整数n相乘,相当于遍历n次cycler对象。

In [1]: from cycler import cycler
In [2]: color_cycle = cycler(color=['r', 'g', 'b'])
In [3]: color_cycle * 2
Out[3]: cycler('color', ['r', 'g', 'b', 'r', 'g', 'b'])

cycler对象拼接

cycler对象拼接有一个前提就是两个对象必须有相同的键!

In [1]: from cycler import cycler
In [2]: color_cycle = cycler(color=['r', 'g', 'b'])
In [3]: color_cycle2 = cycler(color=['c', 'm', 'y', 'k'])
In [4]: color_cycle = color_cycle.concat(color_cycle2)
In [5]: color_cycle
Out[6]: cycler('color', ['r', 'g', 'b', 'c', 'm', 'y', 'k'])
In [7]: color_cycle3 = cycler(gray=['0.5'])
In [8]: color_cycle = color_cycle.concat(color_cycle3)
---------------------------------------------------------------------------
ValueError                Traceback (most recent call last)
ValueError: Keys do not match:
    Intersection: set()
    Disjoint: {'color', 'gray'}

cycler对象切片

cycler对象支持切片操作。

In [1]: from cycler import cycler
In [2]: color_cycle = cycler(color=['r', 'g', 'b'])
In [3]: color_cycle[:2]
Out[3]: cycler('color', ['r', 'g'])
In [4]: color_cycle[::-1]
Out[4]: cycler('color', ['b', 'g', 'r'])

案例:设置线条属性

使用cycler

from cycler import cycler
import matplotlib.pyplot as plt

color_cycle = cycler(color=['r', 'g', 'b'])
m_cycle = cycler(marker=['s', 'o'])
m_c = m_cycle * color_cycle
for i, j in enumerate(m_c):
  print(i, j)
  plt.plot([i, i], **j)
plt.show()

matplotlib之属性组合包(cycler)的使用

0 {'marker': 's', 'color': 'r'}
1 {'marker': 's', 'color': 'g'}
2 {'marker': 's', 'color': 'b'}
3 {'marker': 'o', 'color': 'r'}
4 {'marker': 'o', 'color': 'g'}
5 {'marker': 'o', 'color': 'b'}

常规多重循环方法

import matplotlib.pyplot as plt

marker=['s', 'o']
color=['r', 'g', 'b']

n=0
for i in marker:
  for j in color:
    plt.plot([n, n], marker=i, c=j)
    n = n+1
plt.show()

案例总结

相对而言,使用cycler避免了多重循环,当属性种类较多时更简洁,更加灵活。

到此这篇关于matplotlib之属性组合包(cycler)的使用的文章就介绍到这了,更多相关matplotlib 属性组合包内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python简单实现获取当前时间
Aug 27 Python
教你学会使用Python正则表达式
Sep 07 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
MAC中PyCharm设置python3解释器
Dec 15 Python
使用django-crontab实现定时任务的示例
Feb 26 Python
VSCode下配置python调试运行环境的方法
Apr 06 Python
Python3.5多进程原理与用法实例分析
Apr 05 Python
20行python代码实现人脸识别
May 05 Python
pytorch中的transforms模块实例详解
Dec 31 Python
python实现PCA降维的示例详解
Feb 24 Python
python 基于opencv实现图像增强
Dec 23 Python
PYTHON InceptionV3模型的复现详解
May 06 Python
matplotlib bar()实现百分比堆积柱状图
Feb 24 #Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 #Python
pandas apply使用多列计算生成新的列实现示例
Feb 24 #Python
pandas map(),apply(),applymap()区别解析
Feb 24 #Python
Python的Tqdm模块实现进度条配置
Feb 24 #Python
详解pandas apply 并行处理的几种方法
Feb 24 #Python
python自动生成sql语句的脚本
Feb 24 #Python
You might like
浅谈电磁辐射对健康的影响
2021/03/01 无线电
PHP详解ASCII码对照表与字符转换
2011/12/05 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
php实现监听事件
2013/11/06 PHP
nicejforms——美化表单不用愁
2007/02/20 Javascript
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
js中escape对应的C#解码函数 UrlDecode
2012/12/16 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
JS中window.open全屏命令解析及使用示例
2013/12/11 Javascript
获取input标签的所有属性的方法
2016/06/28 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
提升页面加载速度的插件InstantClick
2017/09/12 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
Python中的各种装饰器详解
2015/04/11 Python
Python功能键的读取方法
2015/05/28 Python
Python选课系统开发程序
2016/09/02 Python
Python入门_学会创建并调用函数的方法
2017/05/16 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
十行代码使用Python写一个USB病毒
2019/06/21 Python
澳大利亚冲浪和时尚服装网上购物:SurfStitch
2017/07/29 全球购物
输入N,打印N*N矩阵
2012/02/20 面试题
公司股东合作协议书
2014/09/14 职场文书
群众路线领导班子整改方案
2014/10/25 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
皇城相府导游词
2015/02/06 职场文书
小学生交通安全寄语
2015/02/27 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书