通过循环和函数填充 matplotlib 子图

Posted

技术标签:

【中文标题】通过循环和函数填充 matplotlib 子图【英文标题】:populating matplotlib subplots through a loop and a function 【发布时间】:2015-02-18 13:57:48 【问题描述】:

我需要通过循环迭代绘制图形的子图;每次迭代都会调用另一个模块(=另一个 py 文件)中定义的函数,该函数绘制一对子图。这是我尝试过的 - 可惜不起作用:

1) 在循环之前,创建一个具有足够行数和 2 列的图形:

 import matplotlib.pyplot as plt     
 fig, axarr = plt.subplots(nber_rows,2)

2) 在循环内部,在迭代号 iter_nber 处,调用绘制每个子图的函数:

 fig, axarr = module.graph_function(fig,axarr,iter_nber,some_parameters, some_data)

3) 有问题的函数基本是这样的;每次迭代都会在同一行创建一对子图:

 def graph_function(fig,axarr,iter_nber,some_parameters, some_data):

     axarr[iter_nber,1].plot(--some plotting 1--)
     axarr[iter_nber,2].plot(--some plotting 2--)

     return fig,axarr

这不起作用。我最终在循环结束时得到一个空图。 我已经尝试了上述的各种组合,比如在函数的返回参数中只留下 axarr,但无济于事。显然我不明白这个数字及其子图的逻辑。

非常感谢任何建议。

【问题讨论】:

你能提供一个可行的例子吗? 谢谢hitzg。我希望简化的代码可以帮助您了解我的问题。真正的代码非常非常长,充满了与手头的问题完全无关的细节。 axarr[iter_nber,2] 中的索引2 看起来很奇怪。这应该会引发错误 我认为这将是子图网格的 2d 列?事实上,我完全没有错误。只是一个空的数字。 @Charles - Numpy 数组(或多或少所有 python 对象)使用从 0 开始的索引。 x[2] 是 x 中的第三项,而不是第二项。您发布的代码看起来基本正确。该错误可能是由于您发布的代码中没有显示的相当普通的东西。 【参考方案1】:

您发布的代码似乎基本正确。正如@hitzg 所提到的,除了索引之外,您所做的一切看起来都非常不寻常。

但是,从绘图函数返回图形和轴数组没有多大意义。 (如果您需要访问图形对象,您始终可以通过ax.figure 获取它。)不过,将它们传入并返回它们不会改变任何东西。

这里有一个简单的示例,说明您正在尝试做的事情类型。也许它有助于消除一些困惑?

import numpy as np
import matplotlib.pyplot as plt

def main():
    nrows = 3
    fig, axes = plt.subplots(nrows, 2)

    for row in axes:
        x = np.random.normal(0, 1, 100).cumsum()
        y = np.random.normal(0, 0.5, 100).cumsum()
        plot(row, x, y)

    plt.show()

def plot(axrow, x, y):
    axrow[0].plot(x, color='red')
    axrow[1].plot(y, color='green')

main()

【讨论】:

谢谢乔,是的,这很有用。我特别看到您的函数“绘图”根本没有返回任何内容。我会遵循这个逻辑。另外,我想知道我的绘图功能在另一个文件中的事实是否会产生影响?我不明白为什么,但我可能弄错了。再次感谢 @Charles - 只要您的绘图功能是从其他文件正确导入的,就没有关系。 (例如,如果它是在blah.py 中调用plot 的函数,那么您将需要执行import blahblah.plot(...),而不仅仅是plot(...)。)至于返回什么(或不返回),一个常见的约定是返回绘制的艺术家(例如线条等)。例如,line = ax.plot(...); return line。不过,这纯粹是可选的。它只是为了以后可能易于使用。 是否可以以这种方式迭代子图?假设我生成了一个包含 9 个 3x3 格式的子图的图形。现在我需要在每个子图中创建一个图表。我需要写 9 行还是可以以某种方式循环这些子图?

以上是关于通过循环和函数填充 matplotlib 子图的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 matplotlib 为所有子图设置默认颜色循环?

Matplotlib空白图(应该有子图)

matplotlib 子图的行标题

Matplotlib 循环遍历 seaborn 图中的轴以获取多个子图

如何使用截止或重叠标签调整填充

在子图 Matplotlib 中按列表添加图例