【问题标题】:How does unpacking in fig, ax = plt.subplots() work for more than one subplot?fig, ax = plt.subplots() 中的解包如何为多个子图工作?
【发布时间】: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()

【问题讨论】:

    标签: python matplotlib


    【解决方案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
    • 很抱歉错过了那部分。再次感谢。
    猜你喜欢
    • 2016-03-13
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多