• 沒有找到結果。

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