matplotlb 进阶之Styling with cycler
matplotlib教程学习笔记
cycler
在教程开始之前,我们需要了解cycler模块
from __future__ import print_function
from cycler import cycler
color_cycler = cycler(color=["r", "g", "b"]) #通过cycler 可以创建cycler对象
color_cycler
| 'color' |
|---|
| 'r' |
| 'g' |
| 'b' |
len(color_cycler) #获取长度
3
color_cycler.keys #获取键
{'color'}
from __future__ import print_function
for v in color_cycler:
print(v)
{'color': 'r'}
{'color': 'g'}
{'color': 'b'}
cycler(ec=color_cycler) #可以用已有的cycler对象作为cycler的参数,并返回一个相同的对象
| 'ec' |
|---|
| 'r' |
| 'g' |
| 'b' |
for i in range(5): #看到了这么做会报错,显然的
print(color_cycler[i])
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-9-b6d40aff26d1> in <module>
1 for i in range(5): #看到了这么做会报错,显然的
----> 2 print(color_cycler[i])
C:\Ana\lib\site-packages\cycler.py in __getitem__(self, key)
221 for k, v in six.iteritems(trans)))
222 else:
--> 223 raise ValueError("Can only use slices with Cycler.__getitem__")
224
225 def __iter__(self):
ValueError: Can only use slices with Cycler.__getitem__
cc = color_cycler()
for j, c in zip(range(5), cc): #通过这种方式,我们实际上可以获得一个无限的序列
print(j, c)
0 {'color': 'r'}
1 {'color': 'g'}
2 {'color': 'b'}
3 {'color': 'r'}
4 {'color': 'g'}
#俩个cycler对象的和会以一种“内积”的方式结合
lw_cycler = cycler(lw=range(1, 4)) #注意len(lw_cycler)==3
wc = lw_cycler + color_cycler #如果二者长度不同,是无法相加的
print(len(wc))
print(wc.keys)
for s in wc:
print(s)
3
{'lw', 'color'}
{'lw': 1, 'color': 'r'}
{'lw': 2, 'color': 'g'}
{'lw': 3, 'color': 'b'}
#和是可交换的
lw_c = lw_cycler + color_cycler
c_lw = color_cycler + lw_cycler
for j, (a, b) in enumerate(zip(lw_c, c_lw)):
print("({j}) A: {A!r} B:{B!r}".format(
j=j, A=a, B=b
))
(0) A: {'lw': 1, 'color': 'r'} B:{'color': 'r', 'lw': 1}
(1) A: {'lw': 2, 'color': 'g'} B:{'color': 'g', 'lw': 2}
(2) A: {'lw': 3, 'color': 'b'} B:{'color': 'b', 'lw': 3}
#通过一次性传入多个长度相等的参数,也可以做到类似和的操作
wc = cycler(c=['r', 'g', 'b'], lw=range(1,4))
for s in wc:
print(s)
{'c': 'r', 'lw': 1}
{'c': 'g', 'lw': 2}
{'c': 'b', 'lw': 3}
# 乘法 类似“外积”的一种定义 就是每个都来一下
m_cycler = cycler(marker=['s', 'o'])
m_c = m_cycler * color_cycler
print(len(m_c))
print(m_c.keys)
for s in m_c:
print(s)
6
{'marker', 'color'}
{'marker': 's', 'color': 'r'}
{'marker': 's', 'color': 'g'}
{'marker': 's', 'color': 'b'}
{'marker': 'o', 'color': 'r'}
{'marker': 'o', 'color': 'g'}
{'marker': 'o', 'color': 'b'}
#乘法交换后二者不一定一致
c_m = color_cycler * m_cycler
for j, (a, b) in enumerate(zip(c_m, m_c)):
print("({j}) A: {A!r} B: {B!r}".format(
j=j, A=a, B=b
))
(0) A: {'color': 'r', 'marker': 's'} B: {'marker': 's', 'color': 'r'}
(1) A: {'color': 'r', 'marker': 'o'} B: {'marker': 's', 'color': 'g'}
(2) A: {'color': 'g', 'marker': 's'} B: {'marker': 's', 'color': 'b'}
(3) A: {'color': 'g', 'marker': 'o'} B: {'marker': 'o', 'color': 'r'}
(4) A: {'color': 'b', 'marker': 's'} B: {'marker': 'o', 'color': 'g'}
(5) A: {'color': 'b', 'marker': 'o'} B: {'marker': 'o', 'color': 'b'}
#整数数乘 好像就是简单地扩大几倍
color_cycler * 2 # == 2 * color_cycler
| 'color' |
|---|
| 'r' |
| 'g' |
| 'b' |
| 'r' |
| 'g' |
| 'b' |
color_cycler.concat(color_cycler) #在后面续上? concat
| 'color' |
|---|
| 'r' |
| 'g' |
| 'b' |
| 'r' |
| 'g' |
| 'b' |
color_cycler.concat(m_cycler) #看来concat必须key一致
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-18-c4ba2b85481a> in <module>
----> 1 color_cycler.concat(m_cycler) #看来concat必须key一致
C:\Ana\lib\site-packages\cycler.py in concat(self, other)
423 The concatenated `Cycler`
424 """
--> 425 return concat(self, other)
426
427
C:\Ana\lib\site-packages\cycler.py in concat(left, right)
459 just_one=left.keys ^ right.keys)
460
--> 461 raise ValueError(msg)
462
463 _l = left.by_key()
ValueError: Keys do not match:
Intersection: set()
Disjoint: {'marker', 'color'}
# 切片操作
color_cycler[::-1] #倒序
| 'color' |
|---|
| 'b' |
| 'g' |
| 'r' |
color_cycler[:2]
| 'color' |
|---|
| 'r' |
| 'g' |
color_cycler[1:]
| 'color' |
|---|
| 'g' |
| 'b' |
#我们可以通过by_key方法来检视,感觉就是获得某个键及其值啊
c_m.by_key()
{'marker': ['s', 'o', 's', 'o', 's', 'o'],
'color': ['r', 'r', 'g', 'g', 'b', 'b']}
#这个字典可以用作创建新的cycler的蓝本
bk = c_m.by_key()
bk['color'] = ['green'] * len(c_m)
cycler(**bk)
| 'color' | 'marker' |
|---|---|
| 'green' | 's' |
| 'green' | 'o' |
| 'green' | 's' |
| 'green' | 'o' |
| 'green' | 's' |
| 'green' | 'o' |
一些例子
from itertools import cycle
import matplotlib.pyplot as plt
from cycler import cycler
import numpy as np
fig, (ax1, ax2) = plt.subplots(1, 2, tight_layout=True,
figsize=(8, 4))
x = np.arange(10)
color_cycler = cycler(c=["r", "g", "b"])
for i, sty in enumerate(color_cycler):
ax1.plot(x, x*(i+1), **sty)
for i, sty in zip(range(1, 5), cycle(color_cycler)):
ax2.plot(x, x*i, **sty)
C:\Ana\lib\site-packages\matplotlib\figure.py:2366: UserWarning: This figure includes Axes that are not compatible with tight_layout, so results might be incorrect.
warnings.warn("This figure includes Axes that are not compatible "

这个例子利用了乘法
fig, (ax1, ax2) = plt.subplots(1, 2, tight_layout=True,
figsize=(8, 4))
x = np.arange(10)
color_cycle = cycler(c=['r', 'g', 'b'])
ls_cycle = cycler('ls', ['-', '--'])
lw_cycle = cycler('lw', range(1, 4))
sty_cycle = ls_cycle * (color_cycle + lw_cycle)
for i, sty in enumerate(sty_cycle):
ax1.plot(x, x*(i+1), **sty)
sty_cycle = (color_cycle + lw_cycle) * ls_cycle
for i, sty in enumerate(sty_cycle):
ax2.plot(x, x*(i+1), **sty)

我们总是希望给与不同的线条以不同的方案(变着花样玩)
fig, ax = plt.subplots(tight_layout=True)
x = np.linspace(0, 2*np.pi, 1024)
for i, (lw, c) in enumerate(zip(range(4), ['r', 'g', 'b', 'k'])):
ax.plot(x, np.sin(x - i * np.pi / 4),
label=r'$\phi = {{{0}}} \pi / 4$'.format(i),
lw=lw + 1, #lw线宽
c=c)
ax.set_xlim([0, 2*np.pi])
ax.set_title(r'$y=\sin(\theta + \phi)$')
ax.set_ylabel(r'[arb]')
ax.set_xlabel(r'$\theta$ [rad]')
ax.legend(loc=0);

更为复杂的
fig, ax = plt.subplots(tight_layout=True)
x = np.linspace(0, 2*np.pi, 1024)
for i, (lw, c) in enumerate(zip(range(4), ['r', 'g', 'b', 'k'])):
if i % 2:
ls = '-'
else:
ls = '--'
ax.plot(x, np.sin(x - i * np.pi / 4),
label=r'$\phi = {{{0}}} \pi / 4$'.format(i),
lw=lw + 1,
c=c,
ls=ls)
ax.set_xlim([0, 2*np.pi])
ax.set_title(r'$y=\sin(\theta + \phi)$')
ax.set_ylabel(r'[arb]')
ax.set_xlabel(r'$\theta$ [rad]')
ax.legend(loc=0);

教程
import matplotlib.pyplot as plt
import numpy as np
from cycler import cycler
我们先生成一些样本数据
x = np.linspace(0, 2 * np.pi, 50)
offsets = np.linspace(0, 2 * np.pi, 4, endpoint=False)
yy = np.transpose([np.sin(x + phi) for phi in offsets])
yy.shape
(50, 4)
prop_cycle: the property cycle, 控制未来绘图时候的一些style
default_cycler = (cycler(color=['r', 'g', 'b', 'y']) +
cycler(linestyle=['-', '--', ':', '-.']))
plt.rc('lines', linewidth=4) #设置未来的lines的style
plt.rc('axes', prop_cycle=default_cycler) #设置未来的axes的style
通过matplotlib.axes.Axes.set_prop_cycle可以来设置相应prop_cycle
custom_cycler = (cycler(color=['c', 'm', 'y', 'k']) +
cycler(lw=[1, 2, 3, 4]))
fig, (ax0, ax1) = plt.subplots(nrows=2)
ax0.plot(yy) #default_cycler
ax0.set_title('Set default color cycle to rgby')
ax1.set_prop_cycle(custom_cycler)
ax1.plot(yy)
ax1.set_title('Set axes color cycle to cmyk')
# Add a bit more space between the two plots.
fig.subplots_adjust(hspace=0.3)
plt.show()

函数链接
matplotlb 进阶之Styling with cycler的更多相关文章
- Android 你应该知道的学习资源 进阶之路贵在坚持
1.国外教程网站 Android Developers Blog 不解释 vogella 很不错的网站,免费的,包含android的教程也比较全面,并且教程中经常引用大牛blog,会有很多意外发现.代 ...
- WPF教程十三:自定义控件进阶可视化状态与自定义Panel
如果你敲了上一篇的代码,经过上一篇各种问题的蹂躏,我相信自定义控件基础部分其实已经了解的七七八八了.那么我们开始进阶,现在这篇讲的才是真正会用到的核心的东西.简化你的代码.给你提供更多的可能,掌握了这 ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- nodejs进阶(4)—读取图片到页面
我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...
- JavaScript进阶之路(一)初学者的开始
一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...
- nodejs进阶(3)—路由处理
1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...
- nodejs进阶(5)—接收请求参数
1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword=地球.通过前面的进 ...
- nodejs进阶(1)—输出hello world
下面将带领大家一步步学习nodejs,知道怎么使用nodejs搭建服务器,响应get/post请求,连接数据库等. 搭建服务器页面输出hello world var http = require ...
- [C#] 进阶 - LINQ 标准查询操作概述
LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...
随机推荐
- A Child's History of England.1
A Child's History of England, by Charles Dickens (狄更斯) CHAPTER I ANCIENT ENGLAND AND THE ROMANS If y ...
- 移动开发之h5学习大纲
移动开发学习形式:授课.自学 1.html5 css3 htm5shiv.js response.js 2.流式布局 自适应布局 盒模型 弹性盒模型 响应式布局3.iscroll swiper boo ...
- oracle(查询数据库对象1)
1 --查询表信息 2 xxx_tables--包含表的基本描述信息和统计信息 3 xxx_tab_columns--包含表中列的描述信息和统计信息 4 xxx_all_tables--包含当前数据库 ...
- 【Linux】【Services】【Configuration】puppet
1. 简介 1.1. 官方网站:https://docs.puppet.com/ 1.2. puppet是IT基础设施自动化管理工具,他的整个生命周期包括:provisioning,configura ...
- springmvc中的异常处理方法
//1.自定义异常处理类 2.编写异常处理器 3.配置异常处理器 package com.hope.exception;/** * 异常处理类 * @author newcityma ...
- postman 中get传参数
mybatis中: @RequestMapping(value = "/detail/{id}", method = RequestMethod.GET, produces = & ...
- CPU中的上下文
目录 一.简介 二.进程切换 三.线程切换 四.中断切换 五.中断检测和查看 六.模拟 一.简介 Linux是多任务操作系统,cpu划分固定时间片,分给每个进程,当前进程时间片执行完毕,将挂起,运行下 ...
- 严重危害警告!Log4j 执行漏洞被公开!
12 月 10 日凌晨,Apache 开源项目 Log4j2 的远程代码执行漏洞细节被公开,漏洞威胁等级为:严重. Log4j2 是一个基于 Java 的日志记录工具.它重写了 Log4j 框架,引入 ...
- 转:Intent 操作常用URI代码示例
以下是常用到的Intent的URI及其示例,包含了大部分应用中用到的共用Intent 一.打开一个网页,类别是Intent.ACTION_VIEW 1 2 Uri uri = Uri.parse(&q ...
- 【 二进制】Windows API 记录
FindWindow 原型: HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName ); 该函数获得一个顶层窗口的句柄,该窗口的类名和窗 ...