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 相关文章推荐
精确查找PHP WEBSHELL木马的方法(1)
Apr 12 Python
Python break语句详解
Mar 11 Python
Python对列表排序的方法实例分析
May 16 Python
python中range()与xrange()用法分析
Sep 21 Python
Python实现自动发送邮件功能
Mar 02 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 Python
python中enumerate() 与zip()函数的使用比较实例分析
Sep 03 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 Python
Python多线程:主线程等待所有子线程结束代码
Apr 25 Python
Django ModelForm组件原理及用法详解
Oct 12 Python
python FTP编程基础入门
Feb 27 Python
Pytorch - TORCH.NN.INIT 参数初始化的操作
Feb 27 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
php中文验证码实现示例分享
2014/01/12 PHP
Laravel 5框架学习之表单验证
2015/04/08 PHP
php中final关键字用法分析
2016/12/07 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
jquery中ajax学习笔记4
2011/10/16 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
深入理解javascript变量声明
2014/11/20 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
通过npm或yarn自动生成vue组件的方法示例
2019/02/12 Javascript
Python三元运算实现方法
2015/01/12 Python
Windows下Python的Django框架环境部署及应用编写入门
2016/03/10 Python
Python Socket编程详细介绍
2017/03/23 Python
Python中sort和sorted函数代码解析
2018/01/25 Python
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
python实现录音小程序
2020/10/26 Python
python实现排序算法解析
2018/09/08 Python
python修改txt文件中的某一项方法
2018/12/29 Python
深入理解Python异常处理的哲学
2019/02/01 Python
python 随机生成10位数密码的实现代码
2019/06/27 Python
Python join()函数原理及使用方法
2020/11/14 Python
企业申诉管理制度
2014/01/30 职场文书
安全标准化汇报材料
2014/02/03 职场文书
人力资源管理系自荐信
2014/05/31 职场文书
领导班子个人对照检查剖析材料
2014/09/29 职场文书
单位婚育证明范本
2014/11/21 职场文书
借条如何写
2015/05/26 职场文书
个人催款函范文
2015/06/23 职场文书
煤矿安全学习心得体会
2016/01/18 职场文书
python实现简单的井字棋
2021/05/26 Python
vue3中provide && inject的使用
2021/07/01 Vue.js
Android超详细讲解组件ScrollView的使用
2022/03/31 Java/Android