【问题标题】:What is the relevance of the first line fig,ax=plt.subplots(), when creating a matplotlib plot?创建 matplotlib 图时,第一行 fig,ax=plt.subplots() 的相关性是什么?
【发布时间】:2019-07-18 10:51:59
【问题描述】:

我正在通过 Python 课程中的数据可视化来帮助我的实验报告,我似乎无法理解创建散点图示例中第二行的目的:

import matplotlib.pyplot as plt
fig,ax = plt.subplots()
ax.scatter([1,2,3,4,5],[1,2,3,4,5])
ax.set_xlabel('X')
ax.set_ylabel('Y')
plt.show()

有人能解释一下第一行在这里做什么吗? 我才开始使用 python,之前没有见过这种语法(fig,ax = plt.subplots())。我试图通过编写x,y=1 来测试它是否是一种将两个变量分配给同一事物的方法,我最终得到一个错误“int object is not iterable”。

我不明白的另一件事是fig 在代码主体的任何地方使用?我目前的理解是顶行定义了figax是什么,我可以看到ax在代码主体中用于定义散点图,但是fig在哪里使用?我试图删除它并运行代码,但我得到了这个错误:

'tuple' object has no attribute 'scatter'

如果有人可以解释上述误解。

【问题讨论】:

  • fig 未使用。但如果您愿意,可以使用它。如果你不这样做,它就在那里......不用担心。但是如果你真的不希望它在那里,人们经常使用下划线来表示不需要的变量,_, ax = plt.subplots()。此外,您可以通过动态创建图形ax = plt.figure().subplots() 将轴分配给变量;或者,如果您只想要使用隐式创建图形的替代方法的单个轴,例如 ax = plt.gca() 也是可能的。

标签: python matplotlib subplot


【解决方案1】:

根据official docssubplots 创建一个图形和一组子图。具体来说,

返回

:图

ax:axes.Axes 对象或 Axes 对象数组。如果创建了多个子图,ax 可以是单个 Axes 对象或一组 Axes 对象。结果数组的尺寸可以用squeeze关键字控制,见上文。

当你这样做时

fig, ax = plt.subplots()

图形对象被赋值给变量fig,轴对象被赋值给变量ax

fig 将允许您访问图形级别 上的属性,例如图形标题。 ax 将允许您访问各个子图级别的属性,例如每个子图的图例、轴标签、刻度。如果您有多个子图,它将作为 Axes 对象的数组。

【讨论】:

    【解决方案2】:

    我尝试通过编写 x,y=1 来测试是否可以将 2 个变量分配给同一事物,但最终得到一个错误“int object is not iterable”。

    你几乎是对的。 is 语法同时分配多个变量,但您缺少的是 plt.subplots() 返回一个 tuple - 两个值配对在一起。

    如果你想更好地理解它,你可以运行:

    a, b = (1, 4)
    

    a,b = 1, 4
    

    (就python而言,它是相同的,如果使用或返回多个值,它会将值打包/解包到一个元组)

    我试图删除它并运行代码,但我得到了这个错误:

    'tuple' 对象没有属性'scatter'

    这也与您收到此错误的原因有关。该图确实没有在您的代码 sn-p 中使用,但您需要它让 python 了解您想要使用元组的一部分而不是元组本身。 例如:a=(1,2) 将导致保存一个元组,但在a, b = 1, 2 中,每个创建的变量都将保存一个整数。

    在你的情况下,轴对象有一个方法scatter,而元组对象没有,因此你的错误。

    【讨论】:

    • 这很有意义,它将 fig 分配给元组中的第一个元素,将 ax 分配给元组中的第二个元素。但是,鉴于我没有在代码中的其他任何地方使用过 fig ,这里究竟有什么意义呢?
    • 我编辑了答案,希望能将其清除。基本上 - 通过简单地从分配中删除 fig,让我们调用新对象 new_ax 并调用 new_ax = plt.subplots() 相当于在原始代码的第 3 行创建这个元组:new_ax = (fig, ax)
    • 在您的示例中,您不需要将图形分配给变量 (fig),因为您不再使用它。但是,稍后您可能需要它来调用 fig.tight_layout() 之类的东西或将另一个轴添加到您的图形中。
    猜你喜欢
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2021-05-30
    • 2020-02-22
    • 1970-01-01
    相关资源
    最近更新 更多