在循环中使用pandas子图

4

我有这样的代码,可以在1行6列中很好地绘制我的图表,但尝试将其绘制在2x3或3x2中却失败了。在pandas的.plot()实现中是否有我忽略的东西?plot 1 by 6

fig, axes = plt.subplots(nrows=1, ncols=6)
spfvL = [6, 11, 22, 33, 44, 55]
for j, i in enumerate(spfvL):
    df['spfv' + str(i)] = pd.rolling_std(df['r VIX'], i)*np.sqrt(252)
    res = smf.ols(formula='spfv'+ str(i)+' ~ Q(\'VIX Index\')', data=df).fit()
    df['pred'+ str(i)] = better_predict(res, df)
    df.loc[:,['pred' + str(i), 'spfv' + str(i)]].plot(ax=axes[j])

编辑:尝试下面的方法可以获得2x3,但是变化不大。

axes的形状为(2,3),我无法将正确的参数传递到最后一行ax=axes中。 理想情况下,我应该有类似于ax = axes[x][y]的东西,其中(x,y)在[(0,0),(0,1),(0,2),(1,0),(1,1),(1,2)]中,从而具有与axes完全相同的形状,但是仅仅使用enumerate就能够获得那个“索引”列表...

fig, axes = plt.subplots(nrows=2, ncols=3)
spfvL = [6, 11, 22, 33, 44, 55]
for j, i in enumerate(spfvL):
    df['spfv' + str(i)] = pd.rolling_std(df['r VIX'], i)*np.sqrt(252)
    res = smf.ols(formula='spfv'+ str(i)+' ~ Q(\'VIX Index\')', data=df).fit()
    df['pred'+ str(i)] = better_predict(res, df)
    df.loc[:,['pred' + str(i), 'spfv' + str(i)]].plot(ax=axes[j])

请[编辑]您的帖子并添加您尝试绘制2x3/3x2的代码。 - MattDMo
3个回答

5

由于axes是一个ndarray,我需要一种按索引访问它的方法,而幸运的是,flat方法就可以实现这个目的。

fig, axes = plt.subplots(nrows=2, ncols=3)
spfvL = [6, 11, 22, 33, 44, 55]
for j, i in enumerate(spfvL):
    df['spfv' + str(i)] = pd.rolling_std(df['r VIX'], i) * np.sqrt(252)
    res = smf.ols(formula='spfv'+ str(i)+' ~ Q(\'VIX Index\')', data=df).fit()
    df['pred'+ str(i)] = better_predict(res, df)
    df.loc[:, ['pred' + str(i), 'spfv' + str(i)]].plot(ax=axes.flat[j])

3
同样地,您也可以执行以下操作:
for i, ax in enumerate(axes.reshape(-1)):
     df[spfvL[i]].plot(ax=ax)

1

或者您可以在循环内添加子图:

fig = plt.figure(figsize=(15, 10))
for j, i in enumerate(spfvL):
    fig.add_subplot(2, 3, i+1)
    df.loc[:, ['pred' + str(i), 'spfv' + str(i)]].plot(ax=axes.flat[j])

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