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

19

我需要通过循环迭代绘制图形的子图;每个迭代调用另一个模块(即另一个.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。我希望这个简化的代码能帮助您看到我的问题所在。真正的代码非常长,充满了与手头问题完全无关的细节。 - Charles
2
有一件看起来奇怪的事情是 axarr[iter_nber,2] 中的索引 2。这应该会抛出一个错误。 - hitzg
我以为这将是子图网格的第二列?实际上,我根本没有收到任何错误。只是一个空的图形。 - Charles
1
@Charles - NumPy数组(以及几乎所有Python对象)使用基于0的索引。x [2]是x中的第三项,而不是第二项。您发布的代码似乎基本正确。错误可能是由于一些相当平凡的事情导致的,这些事情在您发布的代码中没有显示出来。 - Joe Kington
对不起,hitzg,你是正确的。在实际代码中,我确实有 O 和 1。 - Charles
显示剩余3条评论
1个回答

23

你发布的代码看起来大部分都是正确的。除了索引问题,就像@hitzg提到的那样,你所做的事情似乎没有什么特别之处。

然而,从绘图函数返回figure和axes数组并没有太多意义。(如果需要访问figure对象,可以通过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()

在此输入图像描述


谢谢Joe,是的,这很有用。我特别注意到你的“plot”函数根本没有返回任何东西。我会遵循这个逻辑。另外,我想知道我的绘图函数在另一个文件中是否会有影响?我不知道为什么,但可能是我错了。再次感谢。 - Charles
@Charles - 只要你的绘图函数从其他文件正确导入,就不会有问题。(例如,如果在 blah.py 中有一个名为 plot 的函数,则需要执行 import blahblah.plot(...),而不是仅仅执行 plot(...)。)至于返回什么(或不返回),一种常见的约定是返回被绘制的艺术家(例如,线条等)。例如,line = ax.plot(...); return line。当然,这完全是可选的。它只是为了以后可能的使用方便而已。 - Joe Kington
在这种方式下,可以迭代子图吗?比如我生成了一个3x3格式的9个子图的图形。现在我需要在每个子图中创建一个图表。我需要写9行代码吗?还是有其他方法可以循环遍历这些子图? - Meet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接