首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在matplotlib中使用plot、axes或figure绘制绘图有什么区别?

在matplotlib中使用plot、axes或figure绘制绘图有什么区别?
EN

Stack Overflow用户
提问于 2016-06-22 22:04:10
回答 2查看 42.6K关注 0票数 131

当我在matplotlib,tbh中绘制图时,我有点困惑,我不清楚图,轴和图形的层次结构。我阅读了文档,它很有帮助,但我仍然感到困惑……

下面的代码以三种不同的方式绘制相同的图-

代码语言:javascript
复制
#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. 这三种方法的区别是什么,我的意思是,当调用这三种方法中的任何一种时,幕后会发生什么?
  2. 什么时候应该使用哪种方法,在这些方法上使用任何一种方法的利弊是什么?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-22 22:16:04

方法1

代码语言:javascript
复制
plt.plot(x, y)

这使您可以使用(x,y)坐标仅绘制一个图形。如果你只想得到一个图形,你可以使用这种方式。

方法2

代码语言:javascript
复制
ax = plt.subplot()
ax.plot(x, y)

这使您可以在同一窗口中绘制一个或多个图形。在您编写它时,您将只绘制一个图形,但您可以做出如下所示:

代码语言:javascript
复制
fig1, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)

您将绘制4个图形,它们分别名为ax1、ax2、ax3和ax4,但每个图形都显示在同一个窗口中。在我的例子中,这个窗口将被分成4个部分。

方法3

代码语言:javascript
复制
fig = plt.figure()
new_plot = fig.add_subplot(111)
new_plot.plot(x, y)

我没有用过它,但是你可以找到文档。

示例:

代码语言:javascript
复制
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()

其他示例:

票数 65
EN

Stack Overflow用户

发布于 2019-06-17 18:06:40

对象的名称

Matplotlib是强面向对象的,它的主要对象是figureaxes (我觉得axes这个名字有点误导,但可能只是我一个人)。

您可以将figure看作是一个画布,您通常可以在其中指定尺寸和可能的背景颜色等。您可以使用canvas,figure,本质上有两种方式,在上面放置其他对象(主要是,但也包括文本标签等)并使用savefig保存其内容。

你可以把axes想象成一把瑞士军刀,一个方便的对象,它提供了一个工具(例如.plot.scatter.hist等)来做所有的事情。许多轴使用多种不同方法中的一种在figure中进行

plt程序接口最初是为了模仿图形接口而开发的,但它与面向对象的接口并没有什么不同,即使您不直接引用主对象(即图形和axes),这些对象也会自动实例化,并且每个plt方法本质上都会转换为对底层基础对象的方法的调用:例如,plt.plot()是<™>D31,<>D32是<代码>D33。

每时每刻,您都可以使用plt.gcfplt.gca来处理这些隐藏对象,当其中一个对象方法尚未移植到plt命名空间中的方法时,有时需要执行此操作。

我想补充的是,plt命名空间还包含许多方便的方法,用于以不同的方式实例化figure和axes。

你的例子

plt.plot(x,y)

在这里,您只使用了plt接口,您只能在每个图形中使用单个axes,但这是您在探索数据时所需要的,这是一个完成工作的快速方法……

第二种方法

ax = plt.subplot() ax.plot(x,y)

在这里,您在plt命名空间中使用了一种方便的方法,为axes对象提供了一个名称(和句柄),但顺便说一句,还有一个隐藏的图形。您可以稍后使用plt axes对象绘制、制作直方图等,所有这些都可以使用界面完成,但您也可以更自由地访问其所有属性并对其进行修改。

图= plt.figure() new_plot = figure.add_subplot(111) new_plot.plot(x,y)

在这里,您首先使用plt命名空间中的一种方便方法实例化图形,然后只使用面向对象的接口。

可以绕过plt便利化方法(matplotlib.figure.Figure),但您必须调整图形以获得更好的交互体验(毕竟,它是一种便利方法)。

个人推荐

我建议在交互式会话的上下文中使用bare plt.plotplt.scatter,可能会使用IPython和它的%matplotlib魔术命令,也可以在探索性Jupyter笔记本的上下文中使用。

  • 如果你有一个永久性的问题需要通过精心调整的子图的自定义排列一劳永逸地解决,如果你想把Matplotlib嵌入到你编写的程序的UI中,

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

票数 62
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37970424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档