当我在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.什么时候应该使用哪种方法?在这些方法上使用任何方法的优缺点是什么?
2条答案
按热度按时间llycmphe1#
对象的名称
Matplotlib是非常面向对象的,它的主要对象是图形和轴(我发现名称
axes
有点误导,但可能只是我)。您可以将图形视为一个 * 画布 *,您通常可以指定其尺寸以及背景颜色等。您可以通过两种方式使用画布(图形),在其上放置其他对象(主要是轴,但也包括文本标签等),并使用
savefig
保存其内容。你可以把axes想象成一把瑞士军刀,一个方便的物体,提供了一个工具(例如
.plot
,.scatter
,.hist
等),大多数情况下。你可以用许多不同的方法在一个图形中放置一个,两个,...许多axes。plt
接口plt过程接口最初是为了模拟MATLAB™接口而开发的,但与面向对象的接口实际上没有什么不同,即使您没有直接引用主对象(即图形和轴)这些对象被自动示例化,并且每个PLT方法,本质上,转换为底层基本对象的方法之一的调用:例如一个
plt.plot()
是一个hidden_axes.plot
并且一个plt.savefig
是一个hidden_figure.savefig
。在任何时候,您都可以使用
plt.gcf
和plt.gca
来处理这些隐藏对象,当某个对象方法尚未移植到plt名称空间中的方法时,有时候需要这样做。我想补充的是,plt名称空间还包含许多方便的方法¹,用于以不同的方式示例化figure和axes。
你的例子
第一种方法
在这里,您只使用plt界面,在每个图中只能使用单个轴,但这正是您在探索数据时所需要的,是完成工作的快速方法...
第二种方法
这里你使用了一个在plt命名空间中的方便的方法来给你的axes对象给予(和句柄),但是顺便说一句,这里还有一个隐藏的figure。你可以稍后使用axes对象来绘图,制作直方图等等,所有你可以用plt接口做的事情,但是你也可以访问它的所有属性,并且更自由地修改它们。
第三种方法
在这里,您开始使用plt名称空间中的一个方便方法示例化一个figure,然后您只使用面向对象的接口。
可以绕过plt便利方法(
matplotlib.figure.Figure
),但随后必须调整图形以获得更好的交互体验(毕竟,这是一种 * 便利 * 方法)。个人推荐
我建议在交互式会话的上下文中使用bare
plt.plot
、plt.scatter
,可能使用IPython及其%matplotlib
magic命令,也可以在探索性Jupyter笔记本的上下文中使用。另一方面,面向对象的方法,加上一些
plt
方便方法¹,才是可行之道在这两个极端之间有一个很大的灰色地带,如果你问我该怎么做,我会说“这要看情况”。
(1)
plt
命名空间中的便利方法真的很方便!特别是,当你使用它们示例化图形和轴时,所有处理交互式窗口所需的细节都会被自动考虑进去。6ljaweal2#
这样你就可以用(x,y)坐标绘制一个图形。如果你只想得到一个图形,你可以用这种方法。
这允许您在同一窗口中绘制一个或多个图形。当您编写它时,您将只绘制一个图形,但您可以创建如下内容:
你将绘制4个图形,分别命名为ax1,ax2,ax3和ax4,但在同一个窗口。这个窗口将被分为4个部分与我的例子。
我没用过,但你可以找到文档。
第一节第一节第一节第一节第一次