使用matplotlib中的绘图,轴或图形绘制绘图有什么区别?

时间:2016-06-22 14:04:10

标签: 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)

现在我的问题是 -

  1. 三者之间有什么区别,我的意思是当调用3种方法中的任何一种时,会发生什么?

  2. 使用哪种方法时应该使用哪种方法?

2 个答案:

答案 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()

enter image description here enter image description here

其他示例:

enter image description here

答案 1 :(得分:3)

对象名称

Matplotlib高度面向对象,其主要对象是(我发现名称axes有点误导,但可能只是我)。

您可以将视为 canvas ,通常可以指定尺寸,例如,背景颜色等。您可以使用画布, ,基本上有两种方式,在其上放置其他对象(主要是,还包括文本标签等),并使用savefig保存其内容。

您可以将视为一种瑞士军刀,它是提供工具(例如.plot.scatter.hist等等),几乎所有内容。您可以使用多种方法之一将放置在中。

plt界面

plt 过程接口最初是为了模仿MATLAB™接口而开发的,但即使您没有直接引用主要对象(例如, ,)这些对象会被自动实例化,并且每个 plt 方法本质上都会转换为其中一种方法的调用基础对象中的一个:例如,plt.plot()hidden_axes.plot,而plt.savefighidden_figure.savefig

每时每刻都可以使用plt.gcfplt.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.plotplt.scatter,可能在其IPython魔术命令中使用%matplotlib,并且在探索性环境中Jupyter笔记本。

另一方面,面向对象的方法,再加上一些plt 便利的方法,是必经之路

  • 如果您有一个永久性的问题要彻底解决一次, 定制的微调子图布置,
  • 如果要将Matplotlib嵌入到编写的程序的UI中。

在这些极端之间有一个很大的灰色区域,如果您问我该怎么做,我只会说“取决于” ...