在循环中在Matplotlib中创建子图?

时间:2013-09-19 17:44:39

标签: python matplotlib pandas ipython-notebook

我正在使用这个代码,它提供了一个接一个的好图(使用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)

我想让下一个旁边共有3个“2up”,总共3行(5个子图)无法弄清楚如何处理,因为所有的子图示例似乎都是用于对数据进行子绘图或者特定图和特定网格布局。

所以我不知道如何创建主要情节,然后将一些图表(在这种情况下为5)分页,标题为两个?

编辑第二行代码,因为我省略了函数调用; - (

2 个答案:

答案 0 :(得分:6)

以下是您需要做的事情:

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) 个额外情节,请执行以下操作:

axs

那片看起来有点粗糙,所以我会解释一下:

数组axs.size包含axs个元素。展平版axs.size - 1的最后一个元素的索引是subsllen(subsl)具有axs个元素,并且相同的推理适用于最后一个元素的索引。但是,我们需要从{{1}}的最后一个元素移回到最后一个绘制的元素,因此我们需要逐步执行-1。

答案 1 :(得分: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))

我不确定你的意思是什么“标题为两个人。”