在 Matplotlib 中循环创建子图?

Posted

技术标签:

【中文标题】在 Matplotlib 中循环创建子图?【英文标题】:Create subplots in Matplotlib in a loop? 【发布时间】:2013-09-24 22:40:20 【问题描述】:

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

我想将“2up”的地块一个接一个地排列,总共 3 行(5 个子图)无法弄清楚如何处理这个问题,因为所有子图示例似乎都是为了将​​数据或特定的地块和特定的网格位置。

所以我不知道如何创建主图,然后绘制多个标题为二合一的图(在本例中为 5 个)?

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

【问题讨论】:

你事先知道子图的数量吗?还是你的情节应该动态增长? 我想要一个动态解决方案,尽管在特定情况下我知道我有 5 个图表 【参考方案1】:

这是你需要做的:

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.flatrow-order 扁平化 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 的最后一个元素移回最后一个 plotted 元素,所以我们需要步进 -1。

【讨论】:

@dartdog 我不明白你的评论。 抱歉在 3 fig 上出现错误,axs = plt.subplots(nrows, 2, sharey=True)>>>range() 整数结束参数,得到浮点数。 下面的答案给了我一个不错的结果,但它已将 x 轴从 0-70 重新标记,而不是像直接绘制时那样使用日期? 只需要将math.ceil 的结果强制转换为int(仅在Python 2 中,仅供参考) 做到了,我什至在 x 轴上有年份 我确实在最后有一个空白图表有什么方法可以删除它?【参考方案2】:

我不确定,但我想你要问的是

# 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))

我不确定您所说的“标题为二合一”是什么意思。

【讨论】:

看起来不错,让我试一试。但我想使用变量 ('Rolling 4q mean %s'%(subsm)) 将标题与每个图表实例相关联 我用上面的函数调用进行的编辑搞砸了我的问题仍然坚持如何循环这个.. @dartdog。我编辑了我的回复,按照我认为您的要求(并修复了一个错误)。 看不到如何合并:H7, subsm = sumsubdesc2(table, subsm) ax1=H7.plot() @dartdog 我对其进行了修改,以便使用您的 sumsubdesc2 函数为每个循环计算 subsm(我记得这不在您的原始代码中)。我不确定该函数的作用,所以这是我对什么会起作用的最佳猜测。

以上是关于在 Matplotlib 中循环创建子图?的主要内容,如果未能解决你的问题,请参考以下文章

在 For 循环 Matplotlib 中创建子图

matplotlib 基础

Matplotlib笔记 · 绘图区域的结构和子图布局与划分(figure, axes, subplots)

在 plotly 中自动创建子图(例如 R 中的 Facetting)

VB 在Visio 2010 以编程方式创建子进程图

如何使用 Plotly Express 创建子图