matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中。它的文档相当完备,并且 Gallery页面 中有上百幅缩略图,打开之后都有源程序。因此如果你需要绘制某种类型的图,只需要在这个页面中浏览/复制/粘贴一下,基本上都能搞定。

1.快速绘图

matplotlib的pyplot子库提供了和matlab类似的绘图API,方便用户快速绘制2D图表。

####(1)一个简单的例子:

python patches 画马鞍形_python patches 画马鞍形

python patches 画马鞍形_python patches 画马鞍形_02

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

python patches 画马鞍形_Text_03


如果希望某个轴占据整个行或者列的话,可以如下调用subplot:

python patches 画马鞍形_Text_04


python patches 画马鞍形_python patches 画马鞍形_05

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

python patches 画马鞍形_配置文件_06

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

结果图如下:

python patches 画马鞍形_python patches 画马鞍形_07


计算主刻度对象:

axis.get_major_locator()

计算副刻度对象:

axis.get_minor_locator()