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

如何将多个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)

关键修改点说明

  1. 全局配置前置:把plt.rcParams挪到循环外,一次性设置图的尺寸,避免重复操作。
  2. 精准操作绘图对象:通过ax = pqr.plot(...)获取坐标轴对象,再用ax.get_figure()拿到对应的figure,后续用ax.set_xlabel、fig.suptitle直接操作该图,确保属性设置不会错位。
  3. 移除无效代码:删掉了没用的空figure创建和最后多余的pdf.savefig(fig),避免PDF出现空白页。
  4. 内存优化:增加plt.close(fig),在每个图处理完成后关闭,释放内存资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:07:32