如何将多个Pandas绘图保存至单个PDF?代码生成图但未成功保存
解决Matplotlib绘图无法保存到单个PDF的问题
我来帮你搞定这个PDF保存的问题!你的代码里有几个小问题导致没法正确把所有销售图存到单个PDF文件里,咱们一步步修正:
问题分析
- 你在循环外创建了
fig = plt.figure(...)但完全没用到,最后还保存这个空图,会在PDF里多一页空白内容。 - 每次用
pqr.plot()生成新图后,你用plt.suptitle等全局plt方法设置属性,这些方法是作用于当前活跃的figure,有时候会和pqr.plot()生成的figure不匹配;而且plt.show()会在显示后关闭当前figure,可能导致后续pdf.savefig(figure)保存的内容异常。 plt.rcParams的设置放在循环里属于重复操作,应该一次性设置在循环外。
修正后的代码
import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages import pandas as pd # 全局设置图尺寸,无需在循环中重复设置 plt.rcParams["figure.figsize"] = [25, 12] # 获取所有唯一的LocationID,直接遍历更简洁 location_ids = mno['LocationID'].unique() with PdfPages('demo_try1.pdf') as pdf: for loc_id in location_ids: # 筛选当前LocationID对应的销售数据 pqr = mno[mno.LocationID == loc_id] # 生成折线图并获取坐标轴对象 ax = pqr.plot(x="Date", y="Quantity") # 从坐标轴获取对应的figure对象 fig = ax.get_figure() # 为当前图设置标题和轴标签(精准作用于当前图) fig.suptitle(f"Sales plot for LocationID: {loc_id}", fontsize=20) ax.set_xlabel('Date', fontsize=18) ax.set_ylabel('Quantity', fontsize=18) # 将当前图保存到PDF pdf.savefig(fig) # 如果需要查看每个图,可以保留plt.show();若无需显示,直接删除该行即可 plt.show() # 手动关闭figure,避免内存占用(尤其当LocationID数量较多时) plt.close(fig)
关键修改点说明
- 全局配置前置:把
plt.rcParams挪到循环外,一次性设置图的尺寸,避免重复操作。 - 精准操作绘图对象:通过
ax = pqr.plot(...)获取坐标轴对象,再用ax.get_figure()拿到对应的figure,后续用ax.set_xlabel、fig.suptitle直接操作该图,确保属性设置不会错位。 - 移除无效代码:删掉了没用的空figure创建和最后多余的
pdf.savefig(fig),避免PDF出现空白页。 - 内存优化:增加
plt.close(fig),在每个图处理完成后关闭,释放内存资源。
内容的提问来源于stack exchange,提问作者Tanvi Sharma
相关产品推荐
相关产品推荐

