[英]What is the difference between drawing plots using plot, axes or figure in 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)
现在我的问题是——
这三个方法之间有什么区别,我的意思是当调用这 3 个方法中的任何一个时,幕后会发生什么?
什么时候应该使用哪种方法,在这些方法上使用 any 的利弊是什么?
方法一
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 个部分。
方法三
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()
其他例子:
Matplotlib 是强烈的面向对象,它的主要对象是图形和轴(我发现名称axes
有点误导,但可能只是我)。
您可以将图形视为画布,您通常会指定其尺寸,可能还包括背景颜色等。您可以使用画布、图形,基本上以两种方式使用,在其上放置其他对象(主要是轴,但还有文本标签等)并使用savefig
保存其内容。
您可以将轴视为一种瑞士军刀,一个方便的对象,它为.plot
提供工具(例如.plot
、 .scatter
、 .hist
等)。 您可以使用多种不同方法之一在图形中放置一个、两个、...多个轴。
plt
接口 plt程序界面最初是为了模仿 MATLAB™ 界面而开发的,但与面向对象的界面并没有真正的不同,即使您不直接引用主要对象(即图形和轴),这些对象也是自动实例化,并且每个plt方法本质上都转换为对底层基本对象的方法之一的调用:例如, plt.plot()
是hidden_axes.plot
, plt.savefig
是hidden_figure.savefig
。
在任何时候,您都可以使用plt.gcf
和plt.gca
来处理这些隐藏的对象,当对象方法之一尚未移植到plt命名空间中的方法时,有时需plt.gca
。
我想补充一点, plt命名空间还包含许多方便的方法,以不同的方式实例化figure和axes 。
第一种方式
plt.plot(x, y)
在这里你只使用plt接口,你只能在每个图形中使用一个轴,但这就是你在探索数据时想要的,这是一个快速完成工作的秘诀......
第二种方式
ax = plt.subplot() ax.plot(x, y)
在这里,您使用plt命名空间中的便捷方法为轴对象命名(和句柄),但顺便说一句,还有一个隐藏的figure 。 您可以稍后使用轴对象来绘制、制作直方图等,所有您可以使用plt界面执行的操作,但您也可以访问其所有属性并更自由地修改它们。
第三种方式
figure = plt.figure() new_plot = figure.add_subplot(111) new_plot.plot(x, y)
在这里,您开始使用plt命名空间中的便捷方法实例化图形,然后仅使用面向对象的接口。
可以绕过plt便捷方法( matplotlib.figure.Figure
),但您必须调整图形以获得更好的交互体验(毕竟,这是一种便捷方法)。
我建议在交互式会话的上下文中使用裸plt.plot
、 plt.scatter
,可能使用IPython及其%matplotlib
魔术命令,以及在探索性 Jupyter 笔记本的上下文中。
另一方面,面向对象的方法,加上一些plt
方便的方法,是要走的路
在这些极端之间有一个很大的灰色区域,如果你问我该怎么做,我只会说“这取决于” ......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.