matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中。它的文档相当完备,并且 Gallery页面 中有上百幅缩略图,打开之后都有源程序。因此如果你需要绘制某种类型的图,只需要在这个页面中浏览/复制/粘贴一下,基本上都能搞定。
1.快速绘图
matplotlib的pyplot子库提供了和matlab类似的绘图API,方便用户快速绘制2D图表。
####(1)一个简单的例子:
(2)配置属性
matplotlib所绘制的图的每个组成部分都对应有一个对象,我们可以通过调用这些对象的属性设置方法 set_*或者pyplot的属性设置函数 setp设置其属性值。例如plot函数返回一个 mat-plotlib.linesLine2D对象的列表,下面的例子显示如何设置Line2D对象的属性:
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> x = np.arange(0, 5, 0.1)
>>> line, = plt.plot(x, x*x) # plot返回一个列表,通过line,获取其第一个元素
# 调用Line2D对象的set_*方法设置属性
>>>line.set_antialiased(False)
# 同时绘制sin和cos两条曲线,lines是一个有两个Line2D对象的列表
>>> lines = plt.plot(x, np.sin(x), x, np.cos(x))
# 调用setp函数同时配置多个Line2D对象的多个属性
>>> plt.setp(lines, color="r", linewidth=2.
同样我们可以通过调用Line2D对象的get_*方法,或者plt.getp函数获取对象的属性:
>>> line.get_linewidth()1.0
>>> plt.getp(lines[0], "color") # 返回color属性'r'
>>> plt.getp(lines[1]) # 输出全部属性
alpha = 1.0
animated = False
antialiased or aa = True
axes = Axes(0.125,0.1;0.775x0.8)
...
注意getp函数只能对一个对象进行操作,它有两种用法:
• 指定属性名:返回对象的指定属性的值。
• 不指定属性名:打印出对象的所有属性和其值。
matplotlib的整个图表为一个Figure对象,此对象在调用plt.figure函数时返回,我们也可以通过plt.gcf函数获取当前的绘图对象。
>>> f=plt.gcf()
>>> plt.getp(f)
2.绘制多轴图
一个绘图对象(figure)可以包含多个轴(axis),在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图。上面的第一个例子中,绘图对象只包括一个轴,因此只显示了一个轴(子图)。我们可以使用subplot函数快速绘制有多个轴的图表。subplot函数的调用形式如下:
subplot(numRows, numCols, plotNum)
subplot将整个绘图区域等分为numRows行 * numCols列个子区域,然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1。如果numRows,numCols和plotNum这三个数都小于10的话,可以把它们缩写为一个整数,例如subplot(323)和subplot(3,2,3)是相同的。subplot在plotNum指定的区域中创建一个轴对象。如果新创建的轴和之前创建的轴重叠的话,之前的轴将被删除。
下面的程序创建3行2列共6个轴,通过axisbg参数给每个轴设置不同的背景颜色。
for idx, color in enumerate("rgbyck"):
plt.subplot(320+idx+1, axisbg=color)
plt.show()
如果希望某个轴占据整个行或者列的话,可以如下调用subplot:
3.配置文件
一幅图有许多需要配置的属性,例如颜色、字体、线型等等。我们在绘图时,并没有一一对这些属性进行配置,许多都直接采用了Matplotlib的缺省配置。Matplotlib将缺省配置保存在一个文件中,通过更改这个文件,我们可以修改这些属性的缺省值。
Matplotlib 使用配置文件 matplotlibrc 时的搜索顺序如下:
• 当前路径 : 程序的当前路径
• 用户配置路径 : 通常为 HOME/.matplotlib/,可以通过环境变量MATPLOTLIBRC修改
• 系统配置路径 : 保存在 matplotlib的安装目录下的 mpl-data下
①获取用户配置路径
import matplotlib
matplotlib.get_configdir()
②获得目前使用的配置文件的路径:
import matplotlib
matplotlib.matplotlib_fname()
③配置文件的读入可以使用 rc_params 函数,它返回一个配置字典:
matplotlib.rc_params()
4.Artist对象
①matplotlib API包含有三层:
• backend_bases.FigureCanvas : 图表的绘制领域
• backend_bases.Renderer : 知道如何在FigureCanvas上如何绘图
• artist.Artist : 知道如何使用Renderer在FigureCanvas上绘图
②Artists分为简单类型和容器类型两种。简单类型的Artists为标准的绘图元件,例如Line2D、 Rectangle、 Text、AxesImage 等等。而容器类型则可以包含许多简单类型的Artists,使它们组织成一个整体,例如Axis、 Axes、Figure等。
③直接使用Artists创建图表的标准流程如下:
• 创建Figure对象
• 用Figure对象创建一个或者多个Axes或者Subplot对象
• 调用Axies等对象的方法创建各种简单类型的Artists
(1)Artist的属性
图表中的每个元素都用一个matplotlib的Artist对象表示,而每个Artist对象都有一大堆属性控制其显示效果。例如Figure对象和Axes对象都有patch属性作为其背景,它的值是一个Rectangle对象。通过设置此它的一些属性可以修改Figrue图表的背景颜色或者透明度等属性。
Artist对象都具有的一些属性:
• alpha : 透明度,值在0到1之间,0为完全透明,1为完全不透明
• animated : 布尔值,在绘制动画效果时使用
• axes : 此Artist对象所在的Axes对象,可能为None
• clip_box : 对象的裁剪框
• clip_on : 是否裁剪
• clip_path : 裁剪的路径
• contains : 判断指定点是否在对象上的函数
• figure : 所在的Figure对象,可能为None
• label : 文本标签
• picker : 控制Artist对象选取
• transform : 控制偏移旋转
• visible : 是否可见
• zorder : 控制绘图
Artist对象的所有属性都通过相应的 get_* 和 set_* 函数进行读写。
如下例子是将图表的背景颜色设置为绿色:
>>> fig = plt.figure()
>>> fig.show()
>>> fig.patch.set_color("g")
>>> fig.canvas.draw()
输出Artist对象的所有属性名和值。
plt.getp(fig.patch)
(2)Figure容器
最大的Artist容器是matplotlib.figure.Figure,它包括组成图表的所有元素。图表的背景是一个Rectangle对象,用Figure.patch属性表示。当你通过调用add_subplot或者add_axes方法往图表中添加轴(子图时),这些子图都将添加到Figure.axes属性中,同时这两个方法也返回添加进axes属性的对象,注意返回值的类型有所不同,实际上AxesSubplot是Axes的子类。
Figure对象有如下属性包含其它的Artist对象:
• axes : Axes对象列表
• patch : 作为背景的Rectangle对象
• images : FigureImage对象列表,用来显示图片
• legends : Legend对象列表
• lines : Line2D对象列表
• patches : patch对象列表
• texts : Text对象列表,用来显示文字
(3)Axes容器
Axes容器是整个matplotlib库的核心,它包含了组成图表的众多Artist对象,并且有许多方法函数帮助我们创建、修改这些对象。
Axes的创建Artist对象的方法:
Axes的方法 | 所创建的对象 | 添加进的列表 |
---|---|---|
annotate | Annotate | texts |
bars | Rectangle | patches |
errorbar | Line2D,Rectangle | lines,patces |
fill | Polygon | patches |
hist | Rectangle | patches |
imshow | AxesImage | images |
legend | Legend | legends |
plot | Line2D | lines |
scatter | PolygonCollection | Colections |
text | Text | texts |
如下例子绘制散列图(scatter):
>>> fig = plt.figure()
>>> ax = fig.add_subplot(111)
>>> t = ax.scatter(np.random.rand(20), np.random.rand(20))
>>> t # 返回值为CircleCollection对象
<matplotlib.collections.CircleCollection object at 0x06004230>
>>> ax.collections # 返回的对象已经添加进了collections列表中
[<matplotlib.collections.CircleCollection object at 0x06004230>]
>>> fig.show()
>>> t.get_sizes() # 获得Collection的点数
20
(4)Axis容器
Axis容器包括坐标轴上的刻度线、刻度文本、坐标网格以及坐标轴标题等内容。刻度包括主刻度和副刻度,分别通过Axis.get_major_ticks和Axis.get_minor_ticks方法获得。每个刻度线都是一个XTick或者YTick对象,它包括实际的刻度线和刻度文本。为了方便访问刻度线和文本,Axis对象提供了get_ticklabels和get_ticklines方法分别直接获得刻度线和刻度文本。
>>> pl.plot([1,2,3],[4,5,6])
[<matplotlib.lines.Line2D object at 0x0AD3B670>]
>>> pl.show()
>>> axis = pl.gca().xaxis
>>> axis.get_ticklocs() # 获得刻度的位置列表
array([ 1. , 1.5, 2. , 2.5, 3. ])
>>> axis.get_ticklabels() # 获得刻度标签列表
<a list of 5 Text major ticklabel objects>
>>> [x.get_text() for x in axis.get_ticklabels()] # 获得刻度的文本字符串
[u'1.0', u'1.5', u'2.0', u'2.5', u'3.0']
>>> axis.get_ticklines() # 获得主刻度线列表,图的上下刻度线共10条
<a list of 10 Line2D ticklines objects>
>>> axis.get_ticklines(minor=True) # 获得副刻度线列表
<a list of 0 Line2D ticklines object
获得刻度线或者刻度标签之后,可以设置其各种属性,下面设置刻度线为绿色粗线,文本为红色并且旋转45度:
>>> for label in axis.get_ticklabels():
... label.set_color("red")
... label.set_rotation(45)
... label.set_fontsize(16)
...
>>> for line in axis.get_ticklines():
... line.set_color("green")
... line.set_markersize(25)
... line.set_markeredgewidth(3)
结果图如下:
计算主刻度对象:
axis.get_major_locator()
计算副刻度对象:
axis.get_minor_locator()