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

2025-01-20 09:06:00
admin
原创
102
摘要:问题描述:当我在 matplotlib 中绘制图表时,我有点困惑后端发生了什么,说实话,我不清楚图表、轴和图形的层次结构。我阅读了文档,它很有帮助,但我仍然感到困惑...下面的代码以三种不同的方式绘制相同的图 -#creating the arrays for testing x = np.arange(1,...

问题描述:

当我在 matplotlib 中绘制图表时,我有点困惑后端发生了什么,说实话,我不清楚图表、轴和图形的层次结构。我阅读了文档,它很有帮助,但我仍然感到困惑...

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

#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. 何时应使用哪种方法以及使用其中任何一种方法的优缺点是什么?


解决方案 1:

物体的名称

Matplotlib 是高度面向对象的,其主要对象是图形我觉得这个名字axes有点误导,但可能只是我这么认为)。

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

您可以将视为一种瑞士军刀,一种方便的物品,可提供用于几乎所有用途的工具(例如.plot,等)。您可以.scatter使用多种不同方法之一在图形中放置一个、两个……多个轴。.hist

界面plt

plt过程接口最初是为了模仿 MATLAB™ 接口而开发的但与面向对象接口并没有什么区别,即使您不直接引用主要对象(即图形,这些对象也会自动实例化,并且每个plt方法本质上都会转换为对底层基本对象的方法之一的调用:例如,a plt.plot()is ahidden_axes.plot和 a plt.savefigis a hidden_figure.savefig

plt.gcf您随时都可以使用和来处理这些隐藏对象plt.gca,当某个对象方法尚未移植到plt命名空间中的方法时,这有时是必要的。

我想补充一点,plt命名空间还包含许多便捷方法¹,可以以不同的方式实例化图形

你的例子

第一种方式

plt.plot(x, y)

这里您只使用plt接口,每个上只能使用一个,但这正是您在探索数据时所需要的,一个可以快速完成工作的秘诀……

第二种方式

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

在这里,您使用plt命名空间中的便捷方法为您的对象命名(和句柄),但顺便说一下,还有一个隐藏的图形。您以后可以使用轴对象进行绘图、制作直方图等,所有这些都是使用plt接口可以完成的操作,但您也可以访问其所有属性并以更大的自由度进行修改。

第三种方式

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

在这里,您开始使用plt命名空间中的便捷方法实例化一个图形,稍后您只使用面向对象的接口。

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

个人建议

我建议在交互式会话中使用 bare ,可能使用plt.plotIPython及其神奇命令,也可以在探索性 Jupyter 笔记本中使用。plt.scatter`%matplotlib`

另一方面,面向对象的方法加上一些plt
便捷的方法才是可行的方法

  • 如果你有一个永久性的问题需要通过定制安排精细调整的子图来一劳永逸地解决,

  • 如果您想将 Matplotlib 嵌入到您编写的程序的 UI 中。

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


(1)名称空间中的便捷方法plt确实很方便!特别是,当您使用它们实例化 Figures 和 Axes 时,处理交互式窗口所需的所有细节都会自动考虑在内。

解决方案 2:

方法 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()

在此处输入图片描述
在此处输入图片描述

其他例子:

在此处输入图片描述

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用