fig, ax = plt.subplots() 中的解包如何为多个子图工作?

Posted

技术标签:

【中文标题】fig, ax = plt.subplots() 中的解包如何为多个子图工作?【英文标题】:How does unpacking in fig, ax = plt.subplots() work for more than one subplot? 【发布时间】:2017-04-04 11:27:44 【问题描述】:

我使用的是 python 2.7。

我使用了以下代码并将其应用于我的脚本:http://matplotlib.org/examples/event_handling/data_browser.html

现在,我试图弄清楚它是如何工作的一些具体细节。例如:

fig, (ax, ax2) = plt.subplots(2, 1)

根据我对在 python 中使用逗号的了解,它用于解包。但是在上面的代码中,我无法理解正在解包的内容以及以这种方式解压的原因。是:

fig, (ax, ax2) = plt.subplots(2, 1)

同:

fig, ax, ax2 = plt.subplots(2, 1)

就像 matplotlib faq 中的这段代码一样?:

fig, ax_lst = plt.subplots(2, 2)  # a figure with a 2x2 grid of Axes

fig 是否自动等于fig = plt.figure()

【问题讨论】:

【参考方案1】:

查看plt.subplots() documentation,发现它返回了

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

文档中的函数定义下方给出了使用案例的示例。

所以从这里我们了解到plt.subplots 的返回总是一个元组。元组可以使用逗号解包,

fig, ax = plt.subplots()

第一个元素是matplotlib.figure.Figure,您确实也可以通过调用plt.figure() 来获得它。

元组ax 的第二个元素也可以是元组,具体取决于使用的参数。如果创建了n 行或列,则axn 元组。这个元组可以再次解包,

fig, (ax1, ax2) = plt.subplots(nrows=2)

如果创建了多行列,ax 将是一个元组的元组,可以再次用逗号解包

fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)


最后,就像在 python 中一样
a,b,c   = (5, 6, 7)  # works
a,b,c   = (5,(6,7))  # does not work
a,(b,c) = (5,(6,7))  # works

不能fig, ax, ax2 = plt.subplots(2, 1),它会引发错误。

【讨论】:

感谢您的详尽解释!但是为什么要使用 a,(b,c) = (5,(6,7)) 而不是 a,b,c = (5, 6, 7)?最后的结果不一样吗?还是 a,(b,c) 会按正常返回 'a' 然后 (b,c) 作为元组返回? 如果您自己编写一些代码,您可以选择最适合您需要的a,(b,c) = (5,(6,7))a,b,c = (5, 6, 7),这只是对幕后发生的事情的解释。由于plt.subplots(2,1)(5,(6,7))的形式返回一些东西,这是为了解释为什么fig, ax, ax2 = plt.subplots(2, 1)不起作用。 很好,感谢您的澄清! line, = ax.plot(xs, ys, 'o', picker=5) 怎么样,我找不到任何关于 ax.plot 返回多个项目的信息。为什么我们需要拆线? documentation of plot 明确指出:“返回值是已添加行的列表。”。在大多数情况下,您只生成一行,因此列表仅包含一行,仍需要对其进行解包。另见this question。 很抱歉错过了那部分。再次感谢。

以上是关于fig, ax = plt.subplots() 中的解包如何为多个子图工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥很多例子在 Matplotlib/pyplot/python 中使用 `fig, ax = plt.subplots()`

fig, ax = plt.subplots() 中的解包如何为多个子图工作?

AI_Trade_Model

子图中的 Python xticks

在双 y 图中拉伸图形大小 [重复]

Python-子图仅显示底部图