matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图。而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中。
它的文档相当完备,并且 Gallery页面 中有上百幅缩略图,打开之后都有源程序。因此如果你需要绘制某种类型的图,只需要在这个页面中浏览/复制/粘贴一下。
matplotlib的pyplot子库提供了和matlab类似的绘图API,方便用户快速绘制2D图表。
快速绘图实例:
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt #载入快速绘图的函数库
"""
matplotlib还提供了名为pylab的模块,其中包括了许多numpy和pyplot中常用的函数,方便用
户快速进行计算和绘图,可以用于IPython中的快速交互式使用。
"""
x = np.linspace(0, 10, 1000)
y = np.sin(x) #产生sin函数
z = np.cos(x**2) #产生cos函数
plt.figure(figsize=(8,4)) #通过figsize参数可以指定绘图对象的宽度和高度
"""
调用figure创建一个绘图对象,并且使它成为当前的绘图对象
"""
plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2) #"label"引入latex数学公式,"color"设置线条颜色,"linewidth"设置线条宽度
plt.plot(x,z,"b--",label="$cos(x^2)$")
plt.xlabel("Time(s)") #设置X轴标题
plt.ylabel("Volt") #设置Y轴标题
plt.title("PyPlot First Example") #设置图表的标题
plt.ylim(-1.2,1.2) #设置Y轴的范围
plt.legend() #显示图示
plt.show() #调用plt.show()显示出我们创建的所有绘图对象
set_*方法设置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.0)
这段例子中,通过调用Line2D对象line的set_antialiased方法,关闭对象的反锯齿效果。或者通过调用plt.setp函数配置多个Line2D对象的颜色和线宽属性。
get_*方法设置Line2D对象属性实例:
line.get_linewidth()
plt.getp(lines[0], "color") # 返回color属性
plt.getp(lines[1]) # 输出全部属性
"""
注意getp函数只能对一个对象进行操作,它有两种用法:
1、指定属性名:返回对象的指定属性的值
2、不指定属性名:打印出对象的所有属性和其值
"""
#matplotlib的整个图表为一个Figure对象,此对象在调用plt.figure函数时返回,我们也可以通过plt.gcf函数获取当前的绘图对象
plt.gcf函数获取当前的绘图对象
f = plt.gcf()
plt.getp(f)
#Figure对象有一个axes属性,其值为AxesSubplot对象的列表,每个AxesSubplot对象代表图表中的一个子图,前面所绘制的图表只包含一个子图,当前子图也可以通过plt.gca获得
plt.getp(f, "axes")
plt.gca()
#用plt.getp可以发现AxesSubplot对象有很多属性,例如它的lines属性为此子图所包括的 Line2D 对象列表
alllines = plt.getp(plt.gca(), "lines")
alllines[0] == line # 其中的第一条曲线就是最开始绘制的那条曲线
通过这种方法我们可以很容易地查看对象的属性和它们之间的包含关系,找到需要配置的属性。
一个绘图对象(figure)可以包含多个轴(axis),在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图。我们可以使用subplot函数快速绘制有多个轴的图表。
subplot函数使用 实例1:
for idx, color in enumerate("rgbyck"):
plt.subplot(320+idx+1, axisbg=color) #创建3行2列共6个轴,通过axisbg参数给每个轴设置不同的背景颜色
plt.show()
subplot函数使用 实例2:
如果希望某个轴占据整个行或者列的话,可以如下调用subplot
plt.subplot(221) # 第一行的左图
plt.subplot(222) # 第一行的右图
plt.subplot(212) # 第二整行
plt.show()
绘图效果:
当绘图对象中有多个轴的时候,可以通过工具栏中的Configure Subplots按钮,交互式地调节轴之间
的间距和轴与边框之间的距离。如果希望在程序中调节的话,可以调用subplots_adjust函数,它有
left, right, bottom, top, wspace, hspace等几个关键字参数,这些参数的值都是0到1之间的小数,它
们是以绘图区域的宽高为1进行正规化之后的坐标或者长度。
一幅图有许多需要配置的属性,例如颜色、字体、线型等等。我们在绘图时,并没有一一对这些属性
进行配置,许多都直接采用了Matplotlib的缺省配置。Matplotlib将缺省配置保存在一个文件中,通
过更改这个文件,我们可以修改这些属性的缺省值。
Matplotlib 使用配置文件 matplotlibrc 时的搜索顺序如下:
通过下面的语句可以获取用户配置路径:
import matplotlib
matplotlib.get_configdir()
'C:\\Documents and Settings\\zhang\\.matplotlib'
通过下面的语句可以获得目前使用的配置文件的路径:
import matplotlib
matplotlib.matplotlib_fname()
'C:\\Python26\\lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc'
由于在当前路径和用户配置路径中都没有找到位置文件,因此最后使用的是系统配置路径下的配置文
件。如果你将matplotlibrc复制一份到脚本的当前目录下:
import os
os.getcwd()
'C:\\zhang\\doc'
复制配置文件之后再运行:
matplotlib.matplotlib_fname()
'C:\\zhang\\doc\\matplotlibrc'
如果你用文本编辑器打开此配置文件的话,你会发现它实际上是定义了一个字典。为了对众多的配置
进行区分,关键字可以用点分开。
配置文件的读入可以使用 rc_params 函数,它返回一个配置字典:
matplotlib.rc_params()
{'agg.path.chunksize': 0,
'axes.axisbelow': False,
'axes.edgecolor': 'k',
'axes.facecolor': 'w',
... ...
在matplotlib模块载入的时候会调用rc_params,并把得到的配置字典保存到rcParams变量中:
matplotlib.rcParams
{'agg.path.chunksize': 0,
'axes.axisbelow': False,
... ...
matplotlib将使用rcParams中的配置进行绘图。用户可以直接修改此字典中的配置,所做的改变会反
映到此后所绘制的图中。例如下面的脚本所绘制的线将带有圆形的点标识符:
matplotlib.rcParams["lines.marker"] = "o"
import pylab
pylab.plot([1,2,3])
pylab.show()
为了方便配置,可以使用rc函数,下面的例子同时配置点标识符、线宽和颜色:
matplotlib.rc("lines", marker="x", linewidth=2, color="red")
如果希望恢复到缺省的配置(matplotlib载入时从配置文件读入的配置)的话,可以调用 rcdefaults 函
数。
matplotlib.rcdefaults()
如果手工修改了配置文件,希望重新从配置文件载入最新的配置的话,可以调用:
matplotlib.rcParams.update( matplotlib.rc_params() )
matplotlib API包含有三层:
(1) backend_bases.FigureCanvas : 图表的绘制领域
(2) backend_bases.Renderer : 知道如何在FigureCanvas上如何绘图
(3) artist.Artist : 知道如何使用Renderer在FigureCanvas上绘图
FigureCanvas和Renderer需要处理底层的绘图操作,例如使用wxPython在界面上绘图,或者使用
PostScript绘制PDF。Artist则处理所有的高层结构,例如处理图表、文字和曲线等的绘制和布局。通
常我们只和Artist打交道,而不需要关心底层的绘制细节。
图表中的每个元素都用一个matplotlib的Artist对象表示,而每个Artist对象都有一大堆属性控制其显示效果。例如Figure对象和Axes对象都有patch属性作为其背景,它的值是一个Rectangle对象。通过设置此它的一些属性可以修改Figrue图表的背景颜色或者透明度等属性。
Artist的属性设置实例:
fig = plt.figure()
fig.show()
fig.patch.set_color("g")
"""
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 : 控制绘图顺序
"""
fig.canvas.draw()
现在我们知道如何观察和修改已知的某个Artist对象的属性,接下来要解决如何找到指定的Artist对
象。
最大的Artist容器是matplotlib.figure.Figure,它包括组成图表的所有元素。图表的背景是一个Rectangle对象,用Figure.patch属性表示。当你通过调用add_subplot或者add_axes方法往图表中添加轴
(子图时),这些子图都将添加到Figure.axes属性中,同时这两个方法也返回添加进axes属性的对象,
注意返回值的类型有所不同,实际上AxesSubplot是Axes的子类。
Figure对象有如下属性包含其它的Artist对象:
(1) axes : Axes对象列表
(2) patch : 作为背景的Rectangle对象
(3) images : FigureImage对象列表,用来显示图片
(4) legends : Legend对象列表
(5) lines : Line2D对象列表
(6) patches : patch对象列表
(7) texts : Text对象列表,用来显示文字
Axes容器是整个matplotlib库的核心,它包含了组成图表的众多Artist对象,并且有许多方法函数帮助我们创建、修改这些对象。和Figure一样,它有一个patch属性作为背景,当它是笛卡尔坐标时,patch属性是一个Rectangle对象,而当它是极坐标时,patch属性则是Circle对象。
Axes包含各种Artist对象的属性:
(1) artists : Artist对象列表
(2) patch : 作为Axes背景的Patch对象,可以是Rectangle或者Circle
(3) collections : Collection对象列表
(4) images : AxesImage对象列表
(5) legends : Legend对象列表
(6) lines : Line2D对象列表
(7) patches : Patch对象列表
(8) texts : Text对象列表
(9) xaxis : XAxis对象
(10) 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方法分别直接获得刻度文本和刻度线。
get_ticklabels方法使用实例:
plt.plot([1,2,3],[4,5,6])
plt.show()
axis = plt.gca().xaxis
axis.get_ticklabels() # 获得刻度标签列表
get_ticklines方法使用实例:
plt.plot([1,2,3],[4,5,6])
plt.show()
axis = plt.gca().xaxis
axis.get_ticklines() # 获得主刻度线列表,图的上下刻度线共10条