matplotlib-绘制精美的图表
5.1 快速绘图
matplotlib的pyplot子库提供了和matlab类似的绘图API,方便用户快速绘制2D图表。让我们先来看 一个简单的例子:
1 # coding: utf-8
-*-2 import numpy as np
3 import matplotlib.pyplot as plt
4
5 x = np.linspace(0, 10, 1000)
6 y = np.sin(x)
7 z = np.cos(x**2)
8
9 plt.figure(figsize=(8,4))
63
10 plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
11 plt.plot(x,z,"b--",label="$cos(x^2)$")
12 plt.xlabel("Time(s)")
13 plt.ylabel("Volt")
14 plt.title("PyPlot First Example")
15 plt.ylim(-1.2,1.2)
16 plt.legend()
17 plt.show()
图 5.1 - 调用pyplot库快速将数据绘制成曲线图
matplotlib中的快速绘图的函数库可以通过如下语句载入:
import matplotlib.pyplot as plt
pylab模块
matplotlib还提供了名为pylab的模块,其中包括了许多numpy和pyplot中常用的函数,方便用 户快速进行计算和绘图,可以用于IPython中的快速交互式使用。
接下来调用figure创建一个绘图对象,并且使它成为当前的绘图对象。
plt.figure(figsize=(8,4))
也可以不创建绘图对象直接调用接下来的plot函数直接绘图,matplotlib会为我们自动创建一个绘图对 象。如果需要同时绘制多幅图表的话,可以是给figure传递一个整数参数指定图标的序号,如果所指定 序号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当前绘图对象。
64 第 5 章 matplotlib-绘制精美的图表
用Python做科学计算
>>> import matplotlib
>>> matplotlib.rcParams["savefig.dpi"]
plt.title("PyPlot First Example") plt.ylim(-1.2,1.2)
5.1.1 配置属性
matplotlib 所 绘 制 的 图 的 每 个 组 成 部 分 都 对 应 有 一 个 对 象, 我 们 可 以 通 过 调 用 这 些 对 象 的 属 性 设 置 方 法 set_* 或 者 pyplot 的 属 性 设 置 函 数 setp 设 置 其 属 性 值。 例 如 plot 函 数 返 回 一 个 mat-plotlib.lines.Line2D 对象的列表,下面的例子显示如何设置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对象的颜色和线宽属性。
同样我们可以通过调用Line2D对象的get_*方法,或者plt.getp函数获取对象的属性值:
1 >>> line.get_linewidth()
2 1.0
3 >>> plt.getp(lines[0], "color") # 返回color属性
4 'r'
5 >>> plt.getp(lines[1]) # 输出全部属性
6 alpha = 1.0
7 animated = False
8 antialiased or aa = True
9 axes = Axes(0.125,0.1;0.775x0.8)
10 ... ...
>>> f = plt.gcf()
>>> plt.getp(f)
66 第 5 章 matplotlib-绘制精美的图表
用Python做科学计算
alpha = 1.0 animated = False ...
Figure对象有一个axes属性,其值为AxesSubplot对象的列表,每个AxesSubplot对象代表图表中的 一个子图,前面所绘制的图表只包含一个子图,当前子图也可以通过plt.gca获得:
>>> plt.getp(f, "axes")
[<matplotlib.axes.AxesSubplot object at 0x05CDD170>]
>>> plt.gca()
<matplotlib.axes.AxesSubplot object at 0x05CDD170>
用plt.getp可以发现AxesSubplot对象有很多属性,例如它的lines属性为此子图所包括的 Line2D 对象 列表:
>>> alllines = plt.getp(plt.gca(), "lines")
>>> alllines
<a list of 3 Line2D objects>
>>> alllines[0] == line # 其中的第一条曲线就是最开始绘制的那条曲线
True
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()