以下代码以三种不同的方式绘制相同的图表 -
#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种方法中的任何一种时,会发生什么?
使用哪种方法时应该使用哪种方法?
答案 0 :(得分:28)
方法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()
其他示例:
答案 1 :(得分:3)
Matplotlib高度面向对象,其主要对象是图和轴(我发现名称axes
有点误导,但可能只是我)。
您可以将图视为 canvas ,通常可以指定尺寸,例如,背景颜色等。您可以使用画布, 图,基本上有两种方式,在其上放置其他对象(主要是轴,还包括文本标签等),并使用savefig
保存其内容。
您可以将轴视为一种瑞士军刀,它是提供工具(例如.plot
,.scatter
,.hist
等等),几乎所有内容。您可以使用多种方法之一将轴放置在图中。
plt
界面 plt 过程接口最初是为了模仿MATLAB™接口而开发的,但即使您没有直接引用主要对象(例如, ,图和轴)这些对象会被自动实例化,并且每个 plt 方法本质上都会转换为其中一种方法的调用基础对象中的一个:例如,plt.plot()
是hidden_axes.plot
,而plt.savefig
是hidden_figure.savefig
。
每时每刻都可以使用plt.gcf
和plt.gca
处理这些隐藏的对象,并且当其中一个对象方法尚未移植到中的方法时,有时这是必需的> plt 名称空间。
我想补充一点, plt 命名空间还包含许多方便的方法,可以以不同的方式实例化 figure 和 axes 。
第一种方式
plt.plot(x, y)
在这里,您仅使用 plt 界面,在每个图中只能使用单个轴,但这就是您想要的您正在探索数据, 快速完成工作的食谱...
第二种方式
ax = plt.subplot() ax.plot(x, y)
这里,您在 plt 命名空间中使用了一种便捷方法来为您的 axes 对象命名(和句柄),但同时还有一个隐藏的图。以后,您可以使用轴对象绘制,创建直方图等,您可以使用 plt 界面执行所有操作,但是您还可以访问其所有属性和对其进行更大的修改。
第三种方式
figure = plt.figure() new_plot = figure.add_subplot(111) new_plot.plot(x, y)
在这里,您开始使用 plt 名称空间中的便捷方法实例化图,然后仅使用面向对象的界面。
可以绕过 plt 便捷方法(matplotlib.figure.Figure
),但随后您必须调整数字以获得更好的交互体验(毕竟,这是便捷< / em>方法)。
我建议在交互式会话的环境中裸露plt.plot
,plt.scatter
,可能在其IPython魔术命令中使用%matplotlib
,并且在探索性环境中Jupyter笔记本。
另一方面,面向对象的方法,再加上一些plt
便利的方法,是必经之路
在这些极端之间有一个很大的灰色区域,如果您问我该怎么做,我只会说“取决于” ...