matplotlib 架构
matplotlib 的架构分为以下三层
- Scripting (脚本)层
- Artist (表现)层
- Backend (后端)层
它们之间的访问关系是:
Scripting 访问 Artist, Artist 访问 Backend
各层级的作用
Backend 为最底层,即 matplotlib API 层,包含的元素有:
- FigureCanvas 对象实现了绘图区的概论
- Renderer 对象在FigureCanvas 上绘图
- Event 对象处理用户输入(键盘和鼠标事件)
Artist 层拥有许多可视化元素,即标题、轴标签、刻度等元素。Aitist 类分为两种:原始(primitive)和复合(composite),即单元素的使用和多元素组合使用。
- Figure
- Axes
- Text
- Y-axis
- Y-ticks
- Y-label
- X-axis
- X-label
- X-ticks
- Line2D
- Axes
Artist 最上层是 Figure 层,表示图形概念; Axes 在 Figure 上面,表示轴的作图的内容(即轴对象),每个维度会有一个 Axes 对象;Axis 用来展示 Axes 上的数值(即刻度与刻度值),刻度的位置用 Locator 对象管理,刻度的标签的格式用 Formatter 对象调整。
Scripting 层包含 pylab 和 pylot 模块,这将是重点学习的内容,不过 pylab 暂不介绍
使用 pylot 生成一幅简单的交互式图像
'''首先导入pylot模块'''
import matplotlib.pyplot as plt
'''调用plot()函数'''
plt.plot([1, 2, 3, 4])
'''调用show()函数,显示图像'''
plt.show()
output_2_0.png
注意,如果是在QtConsole环境中时,不用show()函数也可以显示图像
解析:
plot()
函数需要知道x、y值的对应关系,才能画出图像,上例中只传入了一个列表,plot
会将其当作y的值,而x的值会默认取0、1、2……的递增数值与y值进行对应,便形成了上图的结果
下面,我们为plot()
分别指定x与y的值
plt.plot([1, 2, 3, 4, 5], [2, 9, 6, 4 , 7])
plt.show()
output_5_0.png
线条的默认颜色是蓝色的,可以尝试改变它的颜色:
plt.plot([1, 2, 3, 4, 5], [2, 9, 6, 4 , 7], 'red')
plt.show()
output_7_0.png
好了,从上面的例子,已经摸索出:第一个参数的列表表示x轴的数据,第二个参数的列表表示y轴的数据,第三个参数表示的是线条的颜色可。
另外,观察到,x/y轴的刻度值是随着数据自动匹配的,那如何手动匹配呢?可使用axis()
函数来设定刻度的范围:
plt.axis([0,8,0,10])
plt.plot([1, 2, 3, 4, 5], [2, 9, 6, 4 , 7], 'red')
plt.show()
output_9_0.png
可以看到,线条的形状不变,但它所在的位置发生了变化,因为刻度变了,axis()
中的参数是个列表,列表[xmin, xmax, ymin, ymax]中的元素分别指定x轴的最小与最大值,y轴的最小与最大值。
顺便说一下,title()
函数可以为图表添加标题:
plt.axis([0,8,0,10])
plt.title('我的标题')
plt.plot([1, 2, 3, 4, 5], [2, 9, 6, 4 , 7], 'red')
plt.show()
output_11_0.png
x和y轴数据虽然可以传入列表,实际上在使用的时候会被转换成numpy类型,所以可以直接传入numpy类型作参数,效率会更高。
另外再提一下,第三个参数除了可以指定颜色外,还可以指定画图像的形状:
plt.axis([0,8,0,10])
plt.plot([1, 2, 3, 4, 5], [2, 9, 6, 4 , 7], 'ro')
plt.show()
output_13_0.png
'''导入math和numpy'''
import math
import numpy as np
'''生成0到2.5,间隔为0.1的数列'''
t = np.arange(0,2.5,0.1)
'''
math.pi指圆周率,这里将t中的所有元素乘以圆周率后,
依次作用于math.sin函数上,并返回一个可迭代序列
'''
y1 = list(map(math.sin,math.pi*t))
'''用法同上,只是将t乘以圆周率的值再加上math.pi/4的值,表示偏移量'''
y2 = list(map(math.sin,math.pi*t+math.pi/4))
'''用法同上,这里的偏移量是负数'''
y3 = list(map(math.sin,math.pi*t-math.pi/4))
'''画图'''
plt.plot(t,y1,'b*',t,y2,'g^',t,y3,'ys')
plt.show()
output_14_0.png
解析:
来看一下plot()
的使用语法
Signature: plt.plot(*args, **kwargs)
Docstring:
Plot y versus x as lines and/or markers.
Call signatures::
plot([x], y, [fmt], data=None, **kwargs)
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
The coordinates of the points or line nodes are given by *x*, *y*.
其中plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
指出了可以连续使用多个x/y/fmt参数来同时画多个图形。
根据上例,可得知,fmt
参数,第一个字母表示颜色,字母后面的字符表示形状,b*
则表示的是蓝色的星号,g^
表示的则是绿色的三角,ys
表示的是黄色的方块。
再看个例子:
plt.plot(t,y1,'b--',t,y2,'r.',t,y3,'g+')
plt.show()
output_17_0.png
是不是很奇妙O(∩_∩)O哈哈~
了解 plot() 的参数
在上面的例子里,已经看到plot()
的语法是plt.plot(*args, **kwargs)
,可见,可以传入列表与字典类型的参数,列表类型的参数已经在上面的各例中使用过了,那字典类型的参数如何使用呢?
字典类型的参数又叫关键字参数,又称kwargs,在plot()
的使用中,关键字参数一般用来设置相关属性,比如下面的例子中,设置线条的粗细:
plt.plot(t,y1,linewidth=5.0)
plt.show()
output_21_0.png
linewidth
相关于key,5.0
则是value,能过这种一一对应关系,来指定线条的粗细。
处理多个 Figure 和 Axes 对象
这里想表达的是,在一个图形 Figure 中,使用多个图例 Axes;那如何实现呢?先看下例子,然后再作解析:
t = np.arange(0,5,0.1)
y1 = np.sin(2*np.pi*t)
y2 = np.sin(2*np.pi*t)
plt.subplot(211)
plt.plot(t,y1,'b-')
plt.subplot(212)
plt.plot(t,y2,'r*')
plt.show()
output_24_0.png
解析:
首先生成了x与y的数据
t = np.arange(0,5,0.1)
y1 = np.sin(2*np.pi*t)
y2 = np.sin(2*np.pi*t)
subplot()
函数,可以将图形分为不同的绘图区域,参数中的211指的是:按垂直方向分成2份,按水平方向分成1份,当前可被控制的是第1个区域
plt.subplot(211)
然后对第一个区域进行绘图
plt.plot(t,y1,'b-')
如果想在第二个图上进行绘图,需要将控制指令切换到第二个区域,使用subplot(212)
来指定第三个参数值为2,即控制第二个区域
plt.subplot(212)
最后,在第二个区域上绘图,并显示所有
plt.plot(t,y2,'r*')
plt.show()
接下来再看一下如何将图分成左右两个区域:
t = np.arange(0,5,0.1)
y1 = np.sin(2*np.pi*t)
y2 = np.sin(2*np.pi*t)
plt.subplot(121)
plt.plot(t,y1,'b-')
plt.subplot(122)
plt.plot(t,y2,'r*')
plt.show()
output_27_0.png
网友评论