你遇到了pyplot/state machine接口和OO接口之间的区别。详细解释请参见Which is the recommended way to plot: matplotlib or pylab?和How can I attach a pyplot function to a figure instance?。
更长的教程请参见Anatomy of Matplotlib
有关mpl对象层次结构的一些混淆:
重要类
Figure
整个图形。跟踪所有子axes,一些“特殊”的艺术家(标题、图例等),以及canvas。不要太担心画布,它是至关重要的,因为它是实际进行绘图以获取您的图的对象,但作为用户,它对您来说几乎是不可见的。
Axes
这就是您所认为的“绘图”,它是具有数据空间的图像区域。它有2或3个axis对象(x、y,有时是z),包含一大堆artists。
Axis
这些是类似于数字线的对象。它们负责设置图形限制并生成刻度和刻度标签。它们有Locator
和Formatter
来解决刻度放置和如何生成标签的问题
Artist
基本上您可以在图中看到的所有东西都是艺术家(甚至包括Figure
,Axes
和Axis
对象)。这包括Text
对象、Line2D
对象、collection
对象、Patch
对象...(您懂的)。当渲染图时,所有艺术家都被绘制(递归地)到canvas上。给定的艺术家只能在一个Axes
中。
API层次结构
pylab
基本上,这只是一个命名空间,通过from foo import *
将大量内容(numpy、pyplot、mlab(随matplotlib一起提供))批量导入其中。这对于交互式工作非常方便,但您不应在脚本中使用它。最初的目标是
pyplot
这是一个状态机层,跟踪所有打开的图并具有“当前图”(plt.gcf()
)和“当前轴”(plt.gca()
)的概念。 pyplot
中的大多数函数都是非常轻量级(以编程方式生成的)包装器,用于调用OO层(plt.foo()
-> plt.gca().foo()
或plt.gcf().foo()
取决于函数)。再次强调,这可能是方便的,但可能很快变得限制/令人困惑/全局状态会带来
def my_plotting_fun(ax, data, data, ...):
ax.do_stuff
return list_of_artists_added