You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在for循环中显示StatsForecast.plot绘图的技术求助

解决StatsForecast.plot在for循环内无法显示绘图的问题

核心原因

StatsForecast的plot方法默认会复用当前的matplotlib轴对象,在for循环中如果不主动重置绘图上下文,新的绘图会直接覆盖旧的,导致最终看不到所有(甚至任何)绘图;另外matplotlib的非交互式后端在循环内可能不会自动触发渲染。

可行解决方案

1. 循环内显式创建独立绘图上下文

每次循环时手动创建新的画布和轴,并将轴传递给plot方法的ax参数,确保每次绘图都是独立的:

import matplotlib.pyplot as plt
from statsforecast import StatsForecast
from neuralforecast import AutoNHITS
# 假设已准备好cross_validation结果cv_df,以及StatsForecast实例sf

for cutoff in cv_df['cutoff'].unique():
    # 创建新画布和轴
    fig, ax = plt.subplots(figsize=(10, 6))
    # 筛选当前cutoff的数据并绘图
    sf.plot(df=cv_df[cv_df['cutoff'] == cutoff], ax=ax)
    # 显示绘图
    plt.show()
    # 关闭画布释放内存
    plt.close(fig)

2. 强制触发绘图刷新

如果不想手动创建轴,可以在循环内每次调用plot后,强制刷新matplotlib的渲染,并显式控制显示:

import matplotlib.pyplot as plt

for cutoff in cv_df['cutoff'].unique():
    sf.plot(df=cv_df[cv_df['cutoff'] == cutoff])
    # 强制刷新绘图
    plt.draw()
    plt.pause(0.001)  # 短暂暂停让渲染完成
    plt.show(block=False)  # 非阻塞显示,不影响循环继续
    plt.close()  # 关闭当前画布

3. 手动绘制cross_validation结果(更灵活)

如果依赖StatsForecast的plot方法仍有问题,可以直接提取cross_validation的结果数据,用matplotlib手动绘制,完全控制绘图流程:

import matplotlib.pyplot as plt

for cutoff in cv_df['cutoff'].unique():
    cutoff_data = cv_df[cv_df['cutoff'] == cutoff]
    fig, ax = plt.subplots(figsize=(10, 6))
    # 绘制真实值
    ax.plot(cutoff_data['ds'], cutoff_data['y'], label='真实值', color='blue')
    # 绘制预测值(假设预测列是AutoNHITS)
    ax.plot(cutoff_data['ds'], cutoff_data['AutoNHITS'], label='预测值', color='red', linestyle='--')
    ax.set_title(f'Cutoff: {cutoff}')
    ax.legend()
    plt.show()
    plt.close(fig)

关键注意事项

  • 确保matplotlib使用的是交互式后端(比如TkAgg、Qt5Agg),可以通过plt.get_backend()查看,若为非交互式后端(如Agg),则需要保存图片而非直接显示。
  • 循环内务必关闭不再使用的画布,避免内存泄漏导致程序卡顿。

内容的提问来源于stack exchange,提问作者Eye4got

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:22:38