了解 matplotlib:plt、figure、ax(arr)?

Understanding matplotlib: plt, figure, ax(arr)?

我并不是 matplotlib 的新手,我很惭愧地承认我一直将它用作尽可能快速和轻松地获得解决方案的工具。所以我知道如何获取基本图、子图和其他东西,并且有很多代码会不时重复使用……但我没有 "deep(er) knowledge" of matplotlib.

最近我想我应该改变这一点并自己完成一些教程。但是,我仍然对 matplotlibs pltfig(ure)ax(arr) 感到困惑。到底有什么区别?

在大多数情况下,对于一些“快速'n'肮脏'的绘图,我看到人们只使用 pyplot as plt 并直接使用 plt.plot 绘图。因为我经常有多个东西要绘图,我经常使用 f, axarr = plt.subplots()...但大多数时候您只看到代码将数据放入 axarr 并忽略数字 f.

所以,我的问题是:使用 matplotlib 的简洁方法是什么?什么时候只使用 plt,什么是或应该使用 figure?子图应该只包含数据吗?还是对样式、清除情节、...、子情节内部的一切都有效且良好的做法?

我希望这不是太广泛。基本上我是为了 plt <-> fig <-> ax(arr) 的真正目的寻求一些建议(和 when/how 正确使用它们)。

也欢迎提供教程。 matplotlib 文档让我很困惑。当一个人搜索一些非常具体的东西时,比如重新缩放图例、不同的绘图标记和颜色等等,官方文档非常精确,但我认为一般信息并不是那么好。太多不同的例子,没有对目的的真正解释......看起来或多或少像是所有可能的 API 方法和参数的大列表。

  • pyplot 和 matlab 一样 API 对于那些熟悉 matlab 并想快速制作阴谋的人来说
  • figure 是面向对象的 API 对于那些不关心 matlab 风格绘图的人

因此您可以使用其中任何一个,但可能不能同时使用两者。

pyplot 是 matplotlib 中的 'scripting' 级别 API(它的最高级别 API 可以用 matplotlib 做很多事情)。它允许您以与使用 Matlab 类似的方式使用过程接口来使用 matplotlib。 pyplot 有一个 'current figure' 和 'current axes' 的概念,所有功能都委托给 (@tacaswell dixit)。因此,当您使用模块 pyplot 上可用的函数时,您正在绘制 'current figure' 和 'current axes'.

如果您想 'fine-grain' 控制您正在绘制的 where/what,那么您应该使用面向对象的 API,使用 FigureAxes 的实例。

pyplot 中可用的函数在 Axes 中具有等效方法。

来自回购 anatomy of matplotlib:

  • Figure 是此层次结构中的顶级容器。它是整体 window/page 绘制的所有内容。您可以有多个独立图形,Figures 可以包含多个轴。

但是...

  • 大多数绘图发生在 Axes 上。轴实际上是我们绘制数据的区域以及与之相关的任何 ticks/labels/etc。通常我们会设置一个 Axes 并调用子图(将 Axes 放置在规则网格上),因此在大多数情况下,AxesSubplot 是同义词。

  • 每个 Axes 都有一个 X 轴和一个 Y 轴。这些包含刻度、刻度位置、标签等。

如果您想了解情节的剖析,可以访问此 link

我认为 this 教程很好地解释了 matplotlib 对象层次结构的基本概念,例如图形和轴,以及当前图形和当前轴的概念。

如果你想快速回答:有一个 Figure 对象,它是包装多个 Axes(不同于轴)的容器,它还包含较小的对象,如图例、线条、刻度线……如图所示此图片取自 matplotlib documentation

所以当我们这样做时

>>> import matplotlib.pyplot as plt
>>> fig, ax = plt.subplots()
>>> type(fig)
<class 'matplotlib.figure.Figure'>
>>> type(ax)
<class 'matplotlib.axes._subplots.AxesSubplot'>

我们已经创建了一个 Figure 对象和一个包含在该图中的 Axes 对象。