matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中。
它的文档相当完备,并且Gallery页面中有上百幅缩略图,打开之后都有源程序。因此如果你需要绘制某种类型的图,只需要在这个页面中浏览/复制/粘贴一下,基本上都能搞定。
matplotlib的pyplot子库提供了和matlab类似的绘图API,方便用户快速绘制2D图表。
matplotlib中的快速绘图的函数库可以通过如下语句载入:
import matplotlib.pyplot as plt
matplotlib还提供了名为pylab的模块,其中包括了许多numpy和pyplot中常用的函数,方便用户快速进行计算和绘图,可以用于IPython中的快速交互式使用。
plot函数的调用方式很灵活,第一句将x,y数组传递给plot之后,用关键字参数指定各种属性:
* label : 给所绘制的曲线一个名字,此名字在图示(legend)中显示。只要在字符串前后添加”$”符号,matplotlib就会使用其内嵌的latex引擎绘制的数学公式。
* color : 指定曲线的颜色
* linewidth : 指定曲线的宽度
* xlabel : 设置X轴的文字
* ylabel : 设置Y轴的文字
* title : 设置图表的标题
* ylim : 设置Y轴的范围
* legend : 显示图示
matplotlib 所绘制的图的每个组成部分都对应有一个对象, 我们可以通过调用这些对象的属性设置方法set_*或者pyplot的属性设置函数setp设置其属性值。
我们也可以通过调用Line2D对象的get_*方法,或者plt.getp函数获取对象的属性值。
注意getp函数只能对一个对象进行操作,它有两种用法:
• 指定属性名:返回对象的指定属性的值
• 不指定属性名:打印出对象的所有属性和其值
一个绘图对象(figure)可以包含多个轴(axis),在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图。我们可以使用subplot函数快速绘制有多个轴的图表。subplot函数的调用形式如下:
subplot(numRows, numCols, plotNum)
subplot将整个绘图区域等分为numRows行* numCols列个子区域,然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1。如果numRows,numCols和plotNum这三个数都小于10的话,可以把它们缩写为一个整数,subplot在plotNum指定的区域中创建一个轴对象。如果新创建的轴和之前创建的轴重叠的话,之前的轴将被删除。
当绘图对象中有多个轴的时候,可以通过工具栏中的Configure Subplots按钮,交互式地调节轴之间的间距和轴与边框之间的距离。如果希望在程序中调节的话,可以调用subplots_adjust函数,它有left, right, bottom, top, wspace, hspace等几个关键字参数,这些参数的值都是0到1之间的小数,它们是以绘图区域的宽高为1进行正规化之后的坐标或者长度。
一幅图有许多需要配置的属性,例如颜色、字体、线型等等。我们在绘图时,并没有一一对这些属性进行配置,许多都直接采用了Matplotlib的缺省配置。Matplotlib将缺省配置保存在一个文件中,通过更改这个文件,我们可以修改这些属性的缺省值。
Matplotlib 使用配置文件matplotlibrc 时的搜索顺序如下:
• 当前路径: 程序的当前路径
• 用户配置路径: 通常为HOME/.matplotlib/,可以通过环境变量MATPLOTLIBRC修改
• 系统配置路径: 保存在matplotlib的安装目录下的mpl-data 下
matplotlib API包含有三层:
• backend_bases.FigureCanvas : 图表的绘制领域
• backend_bases.Renderer : 知道如何在FigureCanvas上如何绘图
• artist.Artist : 知道如何使用Renderer在FigureCanvas上绘图
FigureCanvas和Renderer需要处理底层的绘图操作,例如使用wxPython在界面上绘图,或者使用PostScript绘制PDF。Artist则处理所有的高层结构,例如处理图表、文字和曲线等的绘制和布局。通常我们只和Artist打交道,而不需要关心底层的绘制细节。
Artists分为简单类型和容器类型两种。简单类型的Artists为标准的绘图元件,例如Line2D、Rectangle、Text、AxesImage 等等。而容器类型则可以包含许多简单类型的Artists,使它们组织成一个整体,例如Axis、Axes、Figure等。
直接使用Artists创建图表的标准流程如下:
• 创建Figure对象
• 用Figure对象创建一个或者多个Axes或者Subplot对象
• 调用Axies等对象的方法创建各种简单类型的Artists
图表中的每个元素都用一个matplotlib的Artist对象表示,而每个Artist对象都有一大堆属性控制其显示效果。例如Figure对象和Axes对象都有patch属性作为其背景,它的值是一个Rectangle对象。通过设置此它的一些属性可以修改Figrue图表的背景颜色或者透明度等属性。
patch的color属性通过set_color函数进行设置,属性修改之后并不会立即反映到图表的显示上,还需要调用fig.canvas.draw()函数才能够更新显示。
下面是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_* 函数进行读写。
最大的Artist容器是matplotlib.figure.Figure,它包括组成图表的所有元素。图表的背景是一个Rectangle对象,用Figure.patch属性表示。当你通过调用add_subplot或者add_axes方法往图表中添加轴(子图时),这些子图都将添加到Figure.axes属性中,同时这两个方法也返回添加进axes属性的对象,注意返回值的类型有所不同,实际上AxesSubplot是Axes的子类。
为了支持pylab中的gca()等函数,Figure对象内部保存有当前轴的信息,因此不建议直接对Figure.axes属性进行列表操作,而应该使用add_subplot, add_axes, delaxes等方法进行添加和删除操作。但是使用for循环对axes中的每个元素进行操作是没有问题的。
Figure对象可以拥有自己的文字、线条以及图像等简单类型的Artist。缺省的坐标系统为像素点,但是可以通过设置Artist对象的transform属性修改坐标系的转换方式。最常用的Figure对象的坐标系是以左下角为坐标原点(0,0),右上角为坐标(1,1)。
注意为了让所创建的Line2D对象使用fig的坐标,我们将fig.TransFigure赋给Line2D对象的transform属性;为了让Line2D对象知道它是在fig对象中,我们还设置其figure属性为fig;最后还需要将创建的两个Line2D对象添加到fig.lines属性中去。
Figure对象有如下属性包含其它的Artist对象:
• axes : Axes对象列表
• patch : 作为背景的Rectangle对象
• images : FigureImage对象列表,用来显示图片
• legends : Legend对象列表
• lines : Line2D对象列表
• patches : patch对象列表
• texts : Text对象列表,用来显示文字
Axes容器是整个matplotlib库的核心,它包含了组成图表的众多Artist对象,并且有许多方法函数帮助我们创建、修改这些对象。和Figure一样,它有一个patch属性作为背景,当它是笛卡尔坐标时,patch属性是一个Rectangle对象,而当它是极坐标时,patch属性则是Circle对象。
当你调用Axes的绘图方法(例如plot),它将创建一组Line2D对象,并将所有的关键字参数传递给这些Line2D对象,并将它们添加进Axes.lines属性中,最后返回所创建的Line2D对象列表。
下面详细列出Axes包含各种Artist对象的属性:
• artists : Artist对象列表
• patch : 作为Axes背景的Patch对象,可以是Rectangle或者Circle
• collections : Collection对象列表
• images : AxesImage对象列表
• legends : Legend对象列表
• lines : Line2D对象列表
• patches : Patch对象列表
• texts : Text对象列表
• xaxis : XAxis对象
• yaxis : YAxis对象
下面列出Axes的创建Artist对象的方法:
Axes的方法 | 所创建的对象 | 添加进的列表 |
---|---|---|
annotate | Annotate | texts |
bars | Rectangle | patches |
errorbar | Line2D, Rectangle | lines,patches |
fill | Polygon | patches |
hist | Rectangle | patches |
imshow | AxesImage | images |
legend | Legend | legends |
plot | Line2D | lines |
scatter | PolygonCollection | Collections |
text | Text | texts |
Axis容器包括坐标轴上的刻度线、刻度文本、坐标网格以及坐标轴标题等内容。刻度包括主刻度和副刻度,分别通过Axis.get_major_ticks和Axis.get_minor_ticks方法获得。每个刻度线都是一个XTick或者YTick对象,它包括实际的刻度线和刻度文本。为了方便访问刻度线和文本,Axis对象提供了get_ticklabels和get_ticklines方法分别直接获得刻度线和刻度文本。
我们可以使用程序为Axis对象设置不同的Locator对象,用来手工设置刻度的位置;设置Formatter对象用来控制刻度文本的显示。
关于刻度的定位和文本格式的东西都在matplotlib.ticker中定义,程序中使用到如下两个类:
• MultipleLocator : 以指定值的整数倍为刻度放置刻度线
• FuncFormatter : 使用指定的函数计算刻度文本,他会传递给所指定的函数两个参数:刻度值和刻度序号,程序中通过比较笨的办法计算出刻度值所对应的刻度文本