在matplotlib中使用plot、axes或figure绘制图有什么区别?

nfs0ujit  于 2023-01-31  发布在  其他
关注(0)|答案(2)|浏览(179)

当我在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.这三个方法之间有什么区别,我的意思是当调用这三个方法中的任何一个时,引擎盖下会发生什么?
1.什么时候应该使用哪种方法?在这些方法上使用任何方法的优缺点是什么?

llycmphe

llycmphe1#

对象的名称

Matplotlib是非常面向对象的,它的主要对象是图形(我发现名称axes有点误导,但可能只是我)。
您可以将图形视为一个 * 画布 *,您通常可以指定其尺寸以及背景颜色等。您可以通过两种方式使用画布(图形),在其上放置其他对象(主要是,但也包括文本标签等),并使用savefig保存其内容。
你可以把axes想象成一把瑞士军刀,一个方便的物体,提供了一个工具(例如.plot.scatter.hist等),大多数情况下。你可以用许多不同的方法在一个图形中放置一个,两个,...许多axes

plt接口

plt过程接口最初是为了模拟MATLAB™接口而开发的,但与面向对象的接口实际上没有什么不同,即使您没有直接引用主对象(即图形)这些对象被自动示例化,并且每个PLT方法,本质上,转换为底层基本对象的方法之一的调用:例如一个plt.plot()是一个hidden_axes.plot并且一个plt.savefig是一个hidden_figure.savefig

在任何时候,您都可以使用plt.gcfplt.gca来处理这些隐藏对象,当某个对象方法尚未移植到plt名称空间中的方法时,有时候需要这样做。
我想补充的是,plt名称空间还包含许多方便的方法¹,用于以不同的方式示例化figureaxes

你的例子

第一种方法

plt.plot(x, y)

在这里,您只使用plt界面,在每个中只能使用单个,但这正是您在探索数据时所需要的,是完成工作的快速方法...
第二种方法

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

这里你使用了一个在plt命名空间中的方便的方法来给你的axes对象给予(和句柄),但是顺便说一句,这里还有一个隐藏的figure。你可以稍后使用axes对象来绘图,制作直方图等等,所有你可以用plt接口做的事情,但是你也可以访问它的所有属性,并且更自由地修改它们。
第三种方法

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

在这里,您开始使用plt名称空间中的一个方便方法示例化一个figure,然后您只使用面向对象的接口。
可以绕过plt便利方法(matplotlib.figure.Figure),但随后必须调整图形以获得更好的交互体验(毕竟,这是一种 * 便利 * 方法)。

个人推荐

我建议在交互式会话的上下文中使用bare plt.plotplt.scatter,可能使用IPython及其%matplotlib magic命令,也可以在探索性Jupyter笔记本的上下文中使用。
另一方面,面向对象的方法,加上一些plt方便方法¹,才是可行之道

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

在这两个极端之间有一个很大的灰色地带,如果你问我该怎么做,我会说“这要看情况”。
(1)plt命名空间中的便利方法真的很方便!特别是,当你使用它们示例化图形和轴时,所有处理交互式窗口所需的细节都会被自动考虑进去。

6ljaweal

6ljaweal2#

    • 方法1**
plt.plot(x, y)

这样你就可以用(x,y)坐标绘制一个图形。如果你只想得到一个图形,你可以用这种方法。

    • 方法二**
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()

第一节第一节第一节第一节第一次

    • 其他示例:**

相关问题