对6.1节生成的图形进行优化,首先引入数据集,示例代码:
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C, S = np.cos(X), np.sin(X)
6.2.1 Figure对象
通过pyplot模块中的figure()函数创建一个Figure(图表)对象,figsize参数指定Figure对象的宽度和高度,单位是英寸。此外还可以用dpi参数指定Figure对象的分辨率,即每英寸所表示的像素数,默认值为80,即创建的Figure对象的宽度为8*80=640个像素。示例代码:
plt.figure(figsize=(8, 6), dpi=80)
同一个图表多条数据的绘制,示例代码
6.2.2 plot()函数
创建Figure对象之后,接下来调用plot()在当前的Figure对象中绘图。plot()的前两个参数分别表示X、Y轴数据的对象,本示例使用的是NumPy数组。使用关键字参数可以指定所绘制曲线的各种属性:
- label:给曲线指定一个标签,此标签将在图示中显示。
- color:指定曲线的颜色,颜色可以用英文单词或以'#'字符开头的6位十六进制数表示,例如'#ff0000'表示红色。或者使用值在0到1范围之内的三个元素的元组来表示,例如(1.0, 0.0, 0.0)页表示红色。
- linestyle:指定曲线的形状,参数值可以是'-'表示实线,'--'表示虚线。
- linewidth:指定曲线的宽度,可以不是整数,也可以使用缩写形式的参数名lw。
示例代码:
...
plt.plot(X, C, label="cosine", color="#ff0000", linewidth=2.5, linestyle="--")
plt.plot(X, S, label="sine", color="green", linewidth=2.5, linestyle="-")
plt.show()
综合以上代码,其运行结果图6-1所示:

此外,也可以通过第三个参数'b--'指定曲线的颜色和线型,它通过一些易记的符号指定曲线的样式。其中'b'表示蓝色(blue),'--'表示线型为虚线。可以通过plt.plot?命令查看格式化字符串以及各个参数的详细说明。示例代码:
...
plt.plot(X, C, 'b--')
plt.plot(X, S, 'g-')
...
颜色字符缩写及对应颜色如下表所示:
字符 | 颜色 |
---|---|
b | blue 蓝色 |
g | green 绿色 |
r | red 红色 |
c | cyan 青色 |
m | magenta 品红色 |
y | yellow 黄色 |
k | black 黑色 |
w | white 白色 |
6.2.3 Axes对象的各个属性
实际上plot()函数是在Axes(子图)对象上绘图,如果当前的Figure对象没有Axes对象,将会为之创建一个几乎充满整个图表的Axes对象,并且使此Axes对象成为当前的Axes对象。可以通过一系列函数设置当前Axes对象的各个属性:
- xlabel、ylabel:分别设置X、Y轴的标题文字。
- title:设置子图的标题。
- xlim、ylim:分别设置X、Y轴的显示范围。
- xticks、yticks:分别设置X、轴的显示刻度。
- legend:显示图例,即图中表示每条曲线的标签(label)和样式的矩形区域。其中,loc参数可以设置为英文方位单词如upper,middle,lower,left,center,right,或者采用best参数自适应图例位置。
示例代码:
...
plt.xlabel("independent variable")
plt.ylabel("dependent variable")
plt.xlim(-4.0, 4.0)
plt.ylim(-1.0, 1.0)
plt.xticks(np.linspace(-4, 4, 9, endpoint=True))
plt.yticks(np.linspace(-1, 1, 5, endpoint=True))
plt.legend(loc="upper left")
plt.show()
运行结果如图6-2所示:

当前图形的边界有点紧凑,我们想要预留一些空间,以便清楚地查看所有数据点。可以利用xlim和ylim的属性进行设置,示例代码:
...
plt.xlim(X.min() * 1.1, X.max() * 1.1)
plt.ylim(C.min() * 1.1, C.max() * 1.1)
...
此外,当前刻度不太理想,因为它们未显示正弦函数和余弦函数有趣的值,我们将更改它们,以便只显示这些值。示例代码:
...
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi])
plt.yticks([-1, 0, +1])
...
刻度现在被正确放置,但是它们的标签不是很明确。我们可能猜测3.142代表π,它应该更好地使其明确出来。当我们设置刻度值时,我们还可以在第二个参数列表中提供相应的标签。在标签字符串的前后有字符'$',matplotlib会使用内嵌的LaTeX引擎将其显示为数学公式,允许标签更好地呈现出来。而使用LaTeX语法绘制数学公式会极大地降低图表的描绘速度。示例代码:
...
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
plt.yticks([-1, 0, +1], [r'$-1$', r'$0$', r'$+1$'])
...
6.2.4 轴线的设置
轴线是连接轴刻度线并且标记数据区域边界的线。 他们可以被放置在任意位置,直到现在,他们在轴的边界。 我们将改变它,因为我们想把它们放置在中间。 因为它有四个边界(顶部/底部/左侧/右侧),我们将它们的颜色设置为none来丢弃顶部和右侧边界,我们移动底部和左侧的边界将数据空间坐标变为原点。示例代码:
...
ax = plt.gca() # gca stands for 'get current axis'
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
plt.show()
综合以上参数的示例代码:
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-np.pi, np.pi, 256, endpoint=True)
C, S = np.cos(X), np.sin(X)
plt.figure(figsize=(8, 6), dpi=80)
plt.plot(X, C, label="cosine", color="#ff0000", linewidth=2.5, linestyle="--")
plt.plot(X, S, label="sine", color="green", linewidth=2.5, linestyle="-")
plt.xlim(X.min() * 1.1, X.max() * 1.1)
plt.ylim(C.min() * 1.1, C.max() * 1.1)
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
plt.yticks([-1, 0, +1], [r'$-1$', r'$0$', r'$+1$'])
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
plt.legend(loc="upper left")
plt.show()
运行结果如图3所示:

6.2.5 图表的输出和保存
最后调用plt.show()显示绘图窗口,也可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式由图像文件的扩展名决定。下面的程序将当前的图表保存为test.png,并且通过dpi参数指定图像的分辨率为120,因此输出图像的宽度为8*120=960个像素。示例代码:
plt.savefig("test.png", dpi=120)
最后,可以通过help命令,查询相关方法的详细解释,示例代码:
print(help(plt.legend))