Matplotlib函数约定:子图与单个图形

9

我对在matplotlib中使用子图和单个图形时函数(它们被称为函数吗?)的微妙差别感到非常困惑。

例如:

如果我想要更改单个图形的xlim,我会使用:plt.xlim()

如果我想要更改子图形的xlim,我会使用:ax.set_xlim()

为什么会这样?有没有人能够给我指一些解释这种惯例的网站呢? 这是一个简单的例子,因为我知道它们不同,以及如何不同,但有许多我不知道的例子,我很难弄清楚 - 例如:

1)将集合应用于子图:ax.collection(collection_name)。如何对单个图形执行此操作?

2)将刻度标签应用于子图:ax.xaxis.ticklabels(tick_labels)。如何对单个图形执行此操作?

抱歉这是一个新手问题!

1个回答

12

你遇到了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

这些是类似于数字线的对象。它们负责设置图形限制并生成刻度和刻度标签。它们有LocatorFormatter来解决刻度放置和如何生成标签的问题

Artist

基本上您可以在图中看到的所有东西都是艺术家(甚至包括FigureAxesAxis对象)。这包括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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接