概况
画板、画布和绘图区之间是一个层次关系。
- 画板位于最底层,用于放置画布它只是辅助工具,并不需要我们实际操作;
- 画布位于画板之上,是我们绘图的基础;
- 绘图区是画布上用于绘图的区域,一块画布上可以开辟出多个独立的绘图区。
Matplotlib下
- 画板称为Canvas
- 画布称为Figure
- 绘图区称为Axes
由于一个程序窗口只能包含一个画布,所以创建一个画布就是创建一个窗口。
与MATLAB相同,pyplot也存在当前画布窗口和当前绘图区一说。当声明完一个画布或者一个绘图区以后,在此之后的所有代码所绘制的图像都将展示在声明的当前的画布和当前的绘图区上,直到声明了一个新的画布或者绘图区为止。
示例如下:
import numpy as np
import matplotlib.pyplot as plt
plt.figure()
plt.subplot(121)
x1 = np.arange(0.0, 5.0, 0.5)
plt.plot(x1, 2*x1, label='line 1')
plt.legend(loc=2)
plt.subplot(122)
x2 = np.arange(0.0, 10.0, 0.5)
plt.plot(x2, x2**2, 'o--', c='r', label='line 2')
plt.legend(loc=2)
plt.show()
输出的结果如下:
说明:
- plt.subplot(121),声明了一个绘图区,由于此处只定义了一个画布,所以这个绘图区是建立在该画布上的;括号内的‘121’表示,在此画布内划分成了一行两列两个区域,当前绘图区位于第一个区域,后面所有绘图操作均在此绘图区上进行,直至再次声明其他绘图区;
- plt.subplot(122),又声明了一个绘图区,情况与上述相同,只不过这时绘图区是位于第二个区域。
tip:
- 如果只有一个画布,figure()命令可以省略不写,Matplotlib会自动创建;
- 如果绘图区只有一个,subplot(111)也可以不写,系统同样会自动创建绘图区。
部分用于操作画布和绘图区的命令
- 通过gcf()命令得到当前的画布,通过gca()命令得到当前的绘图区;
- 通过clf()命令清除当前的画布,通过cla()命令清除当前绘图区。
关于使用plt.savefig()保存图像后显示不完全的处理
此处提供一种通用的方法。
1、显示不完全的原因
- 通过上面关于画板、画布与绘图区的阐述,可以发现图像显示不完全的是因为某些参数的设置超过了画布的区域。
- 然而plt.savefig()保存的区域只包括画布的区域,故导致图像部分缺失。
2、案例如下
fig, ax1 = plt.subplots()
ax1.plot(np.arange(12), rate, '-o', c='teal', label='line 1', lw=2)
**plt.legend(loc='lower left', bbox_to_anchor=(0.25,-0.35))**
ax1.set_xlabel('st 1')
ax1.set_ylabel('label 1')
ax2 = plt.twinx()
ax2.set_ylabel('label 2')
ax2 = plt.twiny()
ax2.set_xlabel('st 1')
ax2.plot(np.arange(11), inc_rate, '-D', c='orangered', label='line 2', lw=2)
**plt.legend(loc='lower right', bbox_to_anchor=(0.75,-0.35))**
#plt.subplots_adjust(bottom=0.3)
**plt.text(4, 5, 'Figure 1', fontsize=14)**
plt.savefig('./test.png', dpi=200)
plt.show()
查看保存下来的test.png如下:
不难发现图像中缺少了两个legend和一个text。
显然这不是我们要的。
3、解决方法
仔细观察上面的代码,可以发现其中有一行被我注释掉了,那行就是关键,摘抄如下:
#plt.subplots_adjust(bottom=0.3)
plt.subplot_adjust()可以改变绘图区的相对位置或大小来调整各个参数的设置,从而避免上述的问题。
plt.subplots_adjust()的参数如下:
- left:the left side of the subplots of the figure
- right:the right side of the subplots of the figure
- top:the top side of the subplots of the figure
- bottom:the bottom side of the subplots of the figure
- wspace:the amount of width reserved for blank space between subplots
- hspace:the amount of height reserved for white space between subplots
注: 其中参数均为[0,1]的浮点数。
4、更改完后的图像如下
可以看到图像已经完全显示。