多图表(figures)和多图表域(axes)
MATLAB和pyplot具有当前图表和当前图表域的概念。所有绘图功能均应用于当前图表域。函数gca返回当前图表域(matplotlib.axes.Axes实例),而gcf返回当前图表(matplollib.figure.Figure实例)。通常,你不必担心这一点,因为这一切都是在幕后处理的。下面是创建两个子图表的脚本。pyplot:https://matplotlib.org/stable/api/pyplot_summary.html#module-matplotlib.pyplotgca:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.gca.html#matplotlib.pyplot.gcamatplotlib.axes.Axes:https://matplotlib.org/stable/api/axes_api.html#matplotlib.axes.Axesgcf:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.gcf.html#matplotlib.pyplot.gcfmatplollib.figure.Figure:
https://matplotlib.org/stable/api/figure_api.html#matplotlib.figure.Figure
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
import matplotlib.pyplot as pltimport numpy as np
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()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调用是可选的,因为如果不存在,将创建图表,就像如果不存Axes将创建一个(相当于显式sublot()调用)一样。subplot调用指定numrows(行数)、numcols(列数)和plot_number(图表域数),其中plot_number的范围从1到numrows*numcols。如果numrows*numcols<10,则参数中的逗号是可选的。因此, subplot(211)等价于subplot(2, 1, 1)。figure:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.figure.html#matplotlib.pyplot.figuresubplot:
https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplot.html#matplotlib.pyplot.subplot
可以创建任意数量的subplots和axes。如果要手动放置Axes(即,不在矩形网格上), 就要使用axes函数,它能用 axes([left,bottom,width,height])指定位置,其中所有值都是分数(0到1)。有关手动放置Axes的示例,请参见Axes Demo;有关多个sublots的示例,可参见Multiple subplots。axes:
https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axes.html#matplotlib.pyplot.axesAxes Demo:https://matplotlib.org/stable/gallery/subplots_axes_and_figures/axes_demo.htmlMultiple subplots:
https://matplotlib.org/stable/gallery/subplots_axes_and_figures/subplot.html
可以使用不断增加的数字调figure函数用来创建多个figure。当然,每个figure可以包含要多少个就有多少个的axes和subplots:
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
import matplotlib.pyplot as pltplt.figure(1) # the first figureplt.subplot(211) # the first subplot in the first figureplt.plot([1, 2, 3])plt.subplot(212) # the second subplot in the first figureplt.plot([4, 5, 6])
plt.figure(2) # a second figureplt.plot([4, 5, 6]) # creates a subplot() by default
plt.figure(1) # first figure current; # subplot(212) still currentplt.subplot(211) # make subplot(211) in the first figure # currentplt.title('Easy as 1, 2, 3') # subplot 211 titleplt.show()
可以使用clf清除当前图表(figure),使用cla清除当前图表域(axes)。如果你觉得在幕后为你维护状态,特别是当前的图像(image)、图表(figure)和图表域(axes)很烦人,不用绝望,这只是一个面向对象API的薄薄的状态包装器,有替代品,参阅Artist教程。clf:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.clf.html#matplotlib.pyplot.clfcla:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.cla.html#matplotlib.pyplot.claArtist教程:
https://matplotlib.org/stable/tutorials/intermediate/artists.html
如果你正在制作很多图表,你还需要注意另一件事:在用close显式关闭图表(figure)之前,图表所需的内存不会完全释放。删除对图形的所有引用和/或使用窗口管理器关闭屏幕上显示图形的窗口是不够的,因为pyplot在调用close之前会保持内部引用。close:
https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.close.html#matplotlib.pyplot.close