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
行或列,则ax
是n
元组。这个元组可以再次解包,
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()`