has*_*e55 72 python 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)
Run Code Online (Sandbox Code Playgroud)
现在我的问题是 -
三者之间有什么区别,我的意思是当调用3种方法中的任何一种时,会发生什么?
应该使用哪种方法何时以及使用任何方法的利弊是什么?
Ess*_*sex 40
方法1
plt.plot(x, y)
Run Code Online (Sandbox Code Playgroud)
这使您可以使用(x,y)坐标绘制一个图形.如果您只想获得一个图形,可以使用这种方式.
方法2
ax = plt.subplot()
ax.plot(x, y)
Run Code Online (Sandbox Code Playgroud)
这使您可以在同一窗口中绘制一个或多个图形.当你写它时,你只会绘制一个数字,但你可以做这样的事情:
fig1, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)
Run Code Online (Sandbox Code Playgroud)
您将在同一窗口上绘制4个数字,这些数字分别命名为ax1,ax2,ax3和ax4.这个窗口将用我的例子分为4个部分.
方法3
fig = plt.figure()
new_plot = fig.add_subplot(111)
new_plot.plot(x, y)
Run Code Online (Sandbox Code Playgroud)
我没有使用它,但你可以找到文档.
例:
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()
Run Code Online (Sandbox Code Playgroud)
其他例子:
gbo*_*ffi 12
Matplotlib强烈面向对象,其主要对象是图形和轴(我觉得这个名称axes有点误导,但可能只是我一个人)。
您可以将图形视为画布,通常指定其尺寸,并可能指定背景颜色等。您可以通过两种方式使用画布,图形,在其上放置其他对象(主要是轴,但是以及文本标签等),然后使用保存其内容savefig。
你可以把中轴线作为一种瑞士军刀,一个方便的对象,提供了一个工具(例如.plot,.scatter,.hist等)的一切,大部分。您可以使用多种不同的方法之一在图形中放置一,二,...多个轴。
plt接口该PLT程序接口最初是模仿MATLAB™接口,但不是从面向对象的接口确实不同,即使你不直接引用的主要对象(即数字和轴),这些对象自动将其实例化,并且每个plt方法实质上都转换为对基础对象的方法之一的调用:例如,a plt.plot()是a hidden_axes.plot,a plt.savefig是a hidden_figure.savefig。
在任何时候,您都可以使用plt.gcf和来处理这些隐藏对象plt.gca,并且当其中一个对象方法尚未移植到plt名称空间中的方法时,有时这是必需的。
我想补充一点,plt命名空间还包含许多方便的方法,可以用不同的方式实例化Figure和axes。
第一种方式
Run Code Online (Sandbox Code Playgroud)plt.plot(x, y)
在这里,您仅使用plt界面,每个图中只能使用一个轴,但这就是您在探索数据时想要的,这是完成工作的快速方法...
第二路
Run Code Online (Sandbox Code Playgroud)ax = plt.subplot() ax.plot(x, y)
在这里,您可以使用plt命名空间中的便捷方法来为您的axes对象指定名称(和句柄),但顺便说一句,还有一个隐藏的图形。稍后,您可以使用axes对象进行绘图,创建直方图等,这些操作都可以通过plt界面完成,但也可以访问其所有属性并以更大的自由度对其进行修改。
第三种方式
Run Code Online (Sandbox Code Playgroud)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
便捷的方法是必经之路
这些极端之间有一个很大的灰色区域,如果您问我该怎么办,我只会说“这取决于” ...