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
相关产品推荐
相关产品推荐

