(第三部分 多图像和坐标)
MATLAB,和pyplot,都有当前图像(current figure)和当前坐标系(current axes)的概念(concept)。所有的绘制命令(plotting)都应用于当前的坐标系。gca()函数返回当前的坐标系(一个matplotlib.axes.Axes的实例),而gcf()函数返回当前的图像(一个matplotlib.figure.Figure的实例)。通常情况下,你不需要为此担心,所有细节会在后台处理了(bhind the scenes)。下面是一段代码脚本,创建了2个子图(subplot)在一个图像上:
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t)*np.cos(2*np.pi*t)
t1 = np.arange(0.0,5.0,0.1)
t2 = np.arange(0.0,5.0,0.02)
plt.figure(1)
plt.subplot(211)
plt.plot(t1,f(t1),'bo',t2,f(t2),'k')
plt.subplot(212)
plt.plot(t2,np.cos(2*np.pi*t2),'r--')
plt.show()
运行结果如下:
figure()命令在此处是可选的(没有也可以),因为figure(1)会默认创建,正像subplot(111)会默认创建一样,如果你不手动指定任何坐标系的话。
subplot()的三个参数分别指定了 行数量(num rows),列数量(num cols),和 子图数量(num fig),并且 numfig 的取值范围是 1 到 numrows*numcols。(1<=fignum<=numrows*numcols)
subplot 命令中,如果numrows*numcols <10 的话,那么逗号就是可选的。subplot(211)和subplot(2,1,1)是完全等价的。
你可以创建任意数量的子图和坐标系。如果你想手动放置一个坐标系,例如不放置在一个矩形框里,你可以使用axes()命令,这个命令允许你指定坐标系的位置,axes([left,bottom,width,height])此处中所有的值是0到1之间的小数。
查看pylab_examples example code:axes_demo.py了解如何手动放置坐标系
查看 pylab_examples example code:subplots_demo.py了解创建多个子图
你可以通过一个递增的数字调用figure()函数来创建多个图形(figure)。当然,每一个图形可以包含你心中期望(you heart desires)的多个数量的坐标系和子图:
import matplotlib.pyplot as plt
plt.figure(1)#第一个图形
plt.subplot(211)#第一个图形中第一个子图
plt.plot([1,2,3])
plt.subplot(212)#第一个图形中第二个子图
plt.plot([4,5,6])
plt.figure(2)#第二个图形
plt.plot([4,5,6])#默认创建subplot(111)
plt.figure(1)#第一个图形置为当前,subplt(212)置为当前
plt.subplot(211)#把子图subplot(211)置为当前
plt.title('Ease as 1 , 2 , 3')#子图(211)的标题
你可以通过clf()和cla()2个函数来清除当前的图形与坐标系。
如果你发现幕后管理这些图形状况非常的烦人(特别是当前显示的图片image,图形,坐标系),不要失望:这只是面向对象API的一个简单包装,你可以用如下方式替代(查看 Artist tutorial)。
如果你绘制了大量的图形,你需要注意一件事:除非你明确用figure的close()方法关闭图形,否则图形申请的内存并不会完全释放。删除所有对图形的引用,或者用窗口管理器(window manager)杀死(kill)那些出现在屏幕上的图形也不行,因为 pyplot 内部保有(maintain)那些引用,除非你使用close()关闭。