在Matplotlib中循环创建子图?

4
我正在使用这段代码,在IPython-notebook和Pandas中提供了漂亮的图表。
for subsm in subsl:
    H7, subsm = sumsubdesc2(table, subsm)   
    ax1=H7.plot()
    plt.title('Rolling 4q mean %s'%(subsm))
    ax1.set_title('Rolling 4q mean %s'%(subsm))
    ax1.set_ylim(100000,600000)

我想将5个子图以2列3行的方式展示在一起。但是我不知道如何处理,因为所有子图的例子似乎都是针对数据或特定图形和特定网格位置进行子图绘制的。
我不知道如何创建主图,然后子图化多个图形(在这种情况下为5个),并使用标题作为两个并排的呈现方式。
请编辑代码的第二行,因为我遗漏了函数调用。;-(

你是否事先知道子图的数量?还是你的图应该动态增长? - Schorsch
我希望有一个动态的解决方案,尽管在特定情况下我知道我有5个图表。 - dartdog
2个回答

8
以下是您需要做的事情:
import math
import matplotlib.pylab as plt

nrows = int(math.ceil(len(subsl) / 2.))

fig, axs = plt.subplots(nrows, 2)

ylim = 100000, 600000
for ax, subsm in zip(axs.flat, subsl):
    H7, subsm = sumsubdesc2(table, subsm)
    H7.plot(ax=ax, title='Rolling 4q mean %s' % subsm)
    ax.set_ylim(ylim)

即使 axs.size > len(subsl) ,这也能够正常工作,因为当最短的可迭代对象运行完毕时会抛出 StopIteration 异常。请注意,axs.flat 是一个在行顺序上扁平化的 axs 数组的迭代器。
要隐藏没有显示的最后一个图,请执行以下操作:
axs.flat[-1].set_visible(False)

更一般地,对于网格末尾的axs.size - len(subsl)张额外绘图,请执行以下操作:

for ax in axs.flat[axs.size - 1:len(subsl) - 1:-1]:
    ax.set_visible(False)

那个切片看起来有些难懂,所以我来解释一下:
数组axsaxs.size个元素。将axs展开后,最后一个元素的索引为axs.size - 1subsllen(subsl)个元素,同样适用于最后一个元素的索引。但是,我们需要从axs的最后一个元素向回移动到最后一个已绘制的元素,因此我们需要采用-1步长。

@dartdog,我不理解你的评论。 - Phillip Cloud
抱歉,在第三行出现了错误:fig,axs = plt.subplots(nrows,2,sharey = True)>>>range()期望整数作为结尾参数,但提供了浮点数。 - dartdog
下面的答案给了我一个不错的结果,但它重新标记了x轴从0到70,而不是像直接绘制时使用日期。 - dartdog
只需要将 math.ceil 的结果强制转换为 int(仅适用于 Python 2,供参考)。 - Phillip Cloud
更新了。我还添加了对切片的解释。 - Phillip Cloud
显示剩余3条评论

1
我不确定,但我认为你所询问的是什么。
# not tested
import math
import matplotlib.pylab as plt

Nrows = math.ceil(len(subsl) / 2.)
for i in range(len(subsl)):
    subsm = subsl[i]
    H7, subsm = sumsubdesc2(table, subsm) 
    plt.subplot(Nrows, 2, i+1)

    # do some plotting

    plt.title('Rolling 4q mean %s'%(subsm))

我不确定你所说的“titles as two-up”是什么意思。


看起来不错,让我试一下。但是我想使用变量('Rolling 4q mean%s%(subsm)')将标题与每个图表实例关联起来。 - dartdog
我的编辑和上面的函数调用搞砸了我的问题,仍然卡在如何循环这个问题上... - dartdog
@dartdog。我编辑了我的回复,以符合我认为你要求的内容(并修复了一个错误)。 - Greg Whittier
不知道如何整合:H7,subsm = sumsubdesc2(table, subsm) ax1 = H7.plot() - dartdog
@GregWhittier 为什么不使用 subplots 并同时迭代压缩的轴和 subsm - Phillip Cloud
显示剩余5条评论

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