在 matplotlib 中使用情节、轴线或图形绘制情节之间的区别是什么?

当我在 matplotlib,tbh 中绘制情节时,我有点搞不清楚后台发生了什么,我不清楚情节、轴和图形的层次结构。我看了文件,很有帮助,但我还是不明白..。

下面的代码用三种不同的方式绘制了相同的图-

#creating the arrays for testing
x = np.arange(1, 100)
y = np.sqrt(x)
#1st way
plt.plot(x, y)
#2nd way
ax = plt.subplot()
ax.plot(x, y)
#3rd way
figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

现在我的问题是

  1. 这三个方法的区别是什么? 我的意思是,当这三个方法中的任何一个被调用时,底下发生了什么?

  2. 什么时候应该使用哪种方法,以及在这些方法上使用任何方法的优缺点是什么?

55575 次浏览

方法1

plt.plot(x, y)

这使您只能用(x,y)坐标绘制一个图形。如果你只想得到一个图形,你可以使用这种方式。

方法2

ax = plt.subplot()
ax.plot(x, y)

这使您可以在同一窗口中绘制一个或多个图形。当你写它的时候,你只需要绘制一个图形,但是你可以这样做:

fig1, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)

你将在同一个窗口中绘制4个图形,每个图形分别命名为 ax1、 ax2、 ax3和 ax4。这个窗口将被我的例子分为4个部分。

方法3

fig = plt.figure()
new_plot = fig.add_subplot(111)
new_plot.plot(x, y)

我没用过,但你可以找到文件。

示例:

import numpy as np
import matplotlib.pyplot as plt


# Method 1 #


x = np.random.rand(10)
y = np.random.rand(10)


figure1 = plt.plot(x,y)


# Method 2 #


x1 = np.random.rand(10)
x2 = np.random.rand(10)
x3 = np.random.rand(10)
x4 = np.random.rand(10)
y1 = np.random.rand(10)
y2 = np.random.rand(10)
y3 = np.random.rand(10)
y4 = np.random.rand(10)


figure2, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
ax1.plot(x1,y1)
ax2.plot(x2,y2)
ax3.plot(x3,y3)
ax4.plot(x4,y4)


plt.show()

enter image description here enter image description here

其他例子:

enter image description here

对象的名称

Matplotlib 是强面向对象的,它的主要对象是 图表斧头(我发现 axes这个名字有点误导人,但可能只是我)。

你可以把 图表想象成一个 帆布,你通常会指定它的尺寸,例如,背景颜色等等。您使用画布 图表,主要有两种方式,在其上放置其他对象(主要是 斧头,但也包括文本标签等) ,并用 savefig保存其内容。

你可以把 斧头想象成一种瑞士军刀,一种方便的工具(例如 .plot.scatter.hist等等)。你可以放置一个,两个,... 许多 斧头内的 图表使用许多不同的方法之一。

plt接口

谢谢过程接口最初是为了模拟 MATLABTM 接口而开发的,但实际上与面向对象接口并没有什么不同,即使你没有直接引用主对象(例如,图表斧头) ,这些对象也会自动实例化,每个 谢谢方法基本上都会被转换为底层基本对象的一个方法的调用: 例如,plt.plot()hidden_axes.plotplt.savefighidden_figure.savefig

每时每刻,您都可以使用 plt.gcfplt.gca来处理这些隐藏对象,当其中一个对象方法没有被移植到 谢谢名称空间中的方法时,这有时是必要的。

我想补充的是,谢谢名称空间还包含许多方便的方法,以不同的方式实例化 图表斧头

你的例子

第一条路

plt.plot(x, y)

在这里你只能使用 谢谢接口,你只能在每个 图表中使用一个 斧头,但这是你在探索你的数据时想要的, 一个快速完成工作的配方。

第二条路

ax = plt.subplot()
ax.plot(x, y)

在这里,您可以在 谢谢名称空间中使用一种方便的方法为 斧头对象提供名称(和句柄) ,但是顺便说一下,还有一个隐藏的 图表。稍后您可以使用 斧头对象来绘制图表、制作直方图等等,这些都是您可以使用 谢谢接口来做的事情,但是您也可以访问它的所有属性并更自由地修改它们。

第三条路

figure = plt.figure()
new_plot = figure.add_subplot(111)
new_plot.plot(x, y)

在这里,您开始在 谢谢命名空间中使用一种方便的方法实例化 图表,然后您只使用面向对象的接口。

绕过 谢谢方便的方法(matplotlib.figure.Figure)是可能的,但是您必须调整图形以获得更好的交互体验(毕竟,它是 方便方法)。

个人推荐

我建议在交互式会话的背景下使用 plt.plotplt.scatter,可能使用 IPython和它的 %matplotlib魔法命令,也可以在一个探索性的木星笔记本的背景下使用。

另一方面是面向对象的方法,再加上一些 plt 方便的方法,才是正道

  • 如果您有一个永久性的问题要一劳永逸地解决 精心调整的次要情节的定制安排,
  • 如果您想要将 Matplotlib 嵌入到您编写的程序的 UI 中。

在这两个极端之间有一个很大的灰色地带,如果你问我该怎么办,我只会说 “看情况”..。