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

Spyder中for循环绘图与打印顺序错乱及空图问题求助

问题分析与修复方案

我来帮你拆解下代码里的几个关键问题,这正是导致输出顺序混乱和空图出现的核心原因:

1. plt.show未实际调用(缺少括号)

你写的plt.show只是引用了这个函数对象,并没有触发显示图表的操作。必须加上括号plt.show()才会执行图表渲染——这就是为什么所有年份先打印完,最后才一次性出图的根本原因:循环里没触发显示,直到脚本运行到末尾,Spyder的绘图后端才会批量展示所有未关闭的画布。

2. Figure创建顺序逻辑错误

你的代码是先完成绘图,再调用plt.figure(i+1),这会导致:

  • 第一次循环时,绘图默认落在开头创建的plt.figure(0)上,随后创建的figure(1)是空画布
  • 后续循环里,每次都是先在当前活跃的画布上绘图,再创建新的空画布,最后那个没绘图的空画布就是你看到的额外空图

3. 多余的初始空Figure

开头的plt.figure(0)完全没必要,matplotlib会自动创建第一个画布,这个无内容的画布最后就变成了额外的空图。

修复后的代码

把这些问题修正后,代码就能按预期先打印年份,再显示对应图表了:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np  # 注意你用了numpy但没导入,得补上
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", 
          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]  # 假设你定义了这个月份列表

for i in range(5):
    k = 2014 + i
    # 先创建新画布,确保每次绘图在独立的画布上
    plt.figure(i+1)
    crimesyear = crimes.loc[crimes['Year'].isin([k])]
    crimesyear.groupby('Month')['INCIDENT_ID'].count().plot(marker='o')
    plt.xticks(np.arange(12), months)
    plt.ylabel('Number of Crimes')
    plt.title(f'Crime Count by Month - {k}')  # 新增标题,让图表更清晰
    plt.show()  # 这里必须加括号!
    print(k)

额外优化建议

如果想在Spyder里更精准控制图表显示,你可以在IPython控制台的设置里,把图形后端改成Automatic或者TkAgg,避免批量显示的问题。另外,每次绘图后可以调用plt.close()关闭当前画布,防止内存里堆积过多未使用的画布。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:06:45