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脚本在Linux下实现部分Bash Shell的教程
Apr 17 Python
python网络编程之数据传输UDP实例分析
May 20 Python
Python的网络编程库Gevent的安装及使用技巧
Jun 24 Python
windows下ipython的安装与使用详解
Oct 20 Python
Django 前后台的数据传递的方法
Aug 08 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
Jan 15 Python
Python3.5装饰器原理及应用实例详解
Apr 30 Python
对Python _取log的几种方式小结
Jul 25 Python
Django Model中字段(field)的各种选项说明
May 19 Python
python适合做数据挖掘吗
Jun 16 Python
python实现简易自习室座位预约系统
Jun 30 Python
Python基础数据类型tuple元组的概念与用法
Aug 02 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
sae使用smarty模板的方法
2013/12/17 PHP
php使用Jpgraph绘制3D饼状图的方法
2015/06/10 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
javascript中怎么做对象的类型判断
2013/11/11 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
2014/06/09 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
CSS或者JS实现鼠标悬停显示另一元素
2016/01/22 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
利用原生JS与jQuery实现数字线性变化的动画
2017/02/24 Javascript
JS运动特效之任意值添加运动的方法分析
2018/01/24 Javascript
Vue 项目代理设置的优化
2018/04/17 Javascript
Vue v-for循环之@click点击事件获取元素示例
2019/11/09 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
django 常用orm操作详解
2017/09/13 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
python矩阵/字典实现最短路径算法
2019/01/17 Python
pandas的排序和排名的具体使用
2019/07/31 Python
日本土著品牌,综合型购物网站:Cecile
2016/08/23 全球购物
京东国际站:JOYBUY
2017/11/23 全球购物
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
自荐信包含哪些内容
2013/10/30 职场文书
求职自荐信范文格式
2013/11/29 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
煤矿安全演讲稿
2014/05/09 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
党支部对转正的意见
2015/06/02 职场文书
工伤调解协议书
2016/03/21 职场文书
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server