Pandas按年聚合记录循环生成保存柱状图异常问题求解
原代码错误点
你的代码有3个核心问题,直接导致循环逻辑失效、运行中断:
- 变量复用冲突:你把
i同时作为循环迭代变量和数字计数器使用,执行for i in dd时,i会被依次赋值为dd列表里的每个DataFrame分组,完全覆盖掉你之前定义的整数计数器,后续的索引取值逻辑从根源上就错了。 - 自增运算符写反:
i =+ 1是将i直接赋值为正整数1,不是计数器自增1(正确自增写法是i += 1),就算没有变量冲突,这行代码也不会让计数器逐次递增,永远固定为1。 - 未清理画布资源:每次调用plot画图后没有关闭matplotlib画布对象,后续循环的绘图内容会叠加在之前的图层上,内存占用会持续升高,很容易触发程序异常终止。
更优雅的实现方案
完全不需要提前把分组结果转成列表存储,直接遍历groupby的返回值即可,代码更简洁、内存占用更低,也不会出现索引相关的错误:
import matplotlib.pyplot as plt # 直接遍历分组结果,同时拿到年份值和对应分组的DataFrame for year, group_data in df.groupby('year'): # 统计当前年份的期刊类型分布,绘制柱状图 ax = group_data['Journal Type'].value_counts().plot( kind='bar', title=f'Journal Type Distribution - {year}' ) fig = ax.get_figure() # 自动调整布局,避免标签、标题被截断 fig.tight_layout() # 保存图片,直接用年份作为文件名 fig.savefig(f'{year}.png') # 关闭当前画布,释放内存,避免图层叠加 plt.close(fig)
方案优势
- 省去分组转列表、按索引取值的步骤,直接在遍历分组时拿到需要的年份值和对应数据,从根源避免索引越界、变量冲突问题。
- 变量名语义清晰,用
year、group_data代替单字母变量,后续维护时不需要反复猜变量含义。 - 增加布局自动调整逻辑,导出的图片不会出现文字截断的问题。
- 每次存图后主动关闭画布,循环过程中内存占用稳定,不会出现多图叠加、程序中途崩溃的问题,可以顺利跑完所有56个年份的绘图任务。
内容的提问来源于stack exchange,提问作者K3it4r0
相关产品推荐
相关产品推荐

