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()

函数链接

prop_cycle

matplotlb 进阶之Styling with cycler的更多相关文章

  1. Android 你应该知道的学习资源 进阶之路贵在坚持

    1.国外教程网站 Android Developers Blog 不解释 vogella 很不错的网站,免费的,包含android的教程也比较全面,并且教程中经常引用大牛blog,会有很多意外发现.代 ...

  2. WPF教程十三:自定义控件进阶可视化状态与自定义Panel

    如果你敲了上一篇的代码,经过上一篇各种问题的蹂躏,我相信自定义控件基础部分其实已经了解的七七八八了.那么我们开始进阶,现在这篇讲的才是真正会用到的核心的东西.简化你的代码.给你提供更多的可能,掌握了这 ...

  3. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  4. nodejs进阶(4)—读取图片到页面

    我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...

  5. JavaScript进阶之路(一)初学者的开始

    一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...

  6. nodejs进阶(3)—路由处理

    1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...

  7. nodejs进阶(5)—接收请求参数

    1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword=地球.通过前面的进 ...

  8. nodejs进阶(1)—输出hello world

    下面将带领大家一步步学习nodejs,知道怎么使用nodejs搭建服务器,响应get/post请求,连接数据库等. 搭建服务器页面输出hello world var  http  =  require ...

  9. [C#] 进阶 - LINQ 标准查询操作概述

    LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...

随机推荐

  1. pow()是如何实现的?

    如1.5 ** 2.5,如何计算?似乎是这样的: 1. cmath calculates pow(a,b) by performing exp(b * log(a)). stackoverflow 2 ...

  2. C++ 之杂记

    今天做了一个题,代码不难,但是编译的时候就恼火,老是报错,也不告诉我错哪了.... 之前的代码是这样的,在main函数中调用这个类的构造函数,就一直报错,但是不知道原因,后来加上了const 就好了. ...

  3. Android获取通知栏的高度

    1 public static int getStatusBarHeight(Context context){ 2         Class<?> c = null; 3        ...

  4. docker创建tomcat容器无法正常访问

    记一次创建tomcat docker容器后访问是404,进入到tomcat docker容器后发现webapps是空的 1.挂载 docker run -v localConfigFile:/cont ...

  5. 什么是javaScript闭包

    闭包是与函数有着紧密的关系,它是函数的代码在运行过程中的一个动态环境,是一个运行期的概念. 所谓闭包,是指词法表示包括不必计算的变量的函数.也就是说,该函数能够使用函数外定义的变量. 在程序语言中,所 ...

  6. 【Service】【MiddleWare】【Message】rabbitMQ

    1. 概念: 1.1. 消息型中间件:遵循AMQP协议(高级消息队列协议)AMQP 0-9-1 AMQP 1.0 1.2. 路由模型: direct topic fan-out headers 1.3 ...

  7. XML解析器

    1.非验证解析器 检查文档格式是否良好,如用浏览器打开XML文档时,浏览器会进行检查,即格式是否符合XML(可拓展标记语言)基本概念. 2.验证解析器 使用DTD(Document Type Defi ...

  8. 【JAVA今法修真】 第四章 redis特性 击穿雪崩!

    感谢这段时间大家的支持,关注我的微信号:南橘ryc ,回复云小霄,就可以获取到最新的福利靓照一张,还等什么,赶快来加入我们吧~ "明日便是决赛了,咋只会用法器没练过法术呢.". 选 ...

  9. 果蝇优化算法_Fruit Fly Optimization

    1. 果蝇优化算法背景 在夏天,果蝇是一种随处可见的昆虫.果蝇在嗅觉和视觉特别突出.腐烂的食物发出一种刺鼻的味道,温度越高这种气味的扩散速度较快,果蝇对这种味道非常敏感.腐烂的味道和食物的位置有关.一 ...

  10. YonBuilder低代码开发实践:4行代码实现跨实体列表数据同步

    提到增.删.改.查等数据维护,后端开发者们再熟悉不过了.传统的数据维护通过操作数据库的方式实现,步骤比较繁琐,需要通过Java代码实现数据库链接,然后编写SQL语句.编写实体,将想要的数据存到相应的数 ...