保留Matplotlib子图格式将多组图片保存为PDF的技术问询
批量保存Matplotlib子图为PDF的可行方案
核心思路
利用Matplotlib自带的PdfPages类,将每组1行2列的子图批量写入PDF文档——既可以把所有子图组整合到单个PDF,也能按组生成独立PDF文件,完全保留原有子图布局。
具体实现步骤
- 导入依赖库:
pandas处理数据,matplotlib.pyplot绘制子图,PdfPages负责PDF生成,PIL.Image读取图片文件 - 初始化PDF对象(单PDF存所有组的场景)
- 循环遍历DataFrame的每一行:
- 创建1行2列的子图布局,按需设置画布尺寸
- 读取
identity和img列对应的图片文件 - 将图片分别绘制到两个子图轴上,可按需关闭坐标轴、添加标题
- 调整子图间距避免元素重叠
- 将当前画布添加到PDF对象,随后关闭画布释放内存
- 循环结束后关闭PDF对象,完成保存
代码示例
import pandas as pd import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages from PIL import Image # 读取你的数据(替换为实际数据路径) df = pd.read_csv("你的数据文件.csv") # 方案1:所有子图组保存到同一个PDF with PdfPages("批量图片组合集.pdf") as pdf: for idx, row in df.iterrows(): # 创建1行2列子图,设置合适的画布尺寸 fig, (ax0, ax1) = plt.subplots(1, 2, figsize=(12, 6)) # 绘制identity列的图片 img_id = Image.open(row["identity"]) ax0.imshow(img_id) ax0.axis('off') # 关闭坐标轴,按需选择 ax0.set_title("Identity图") # 绘制img列的图片 img_main = Image.open(row["img"]) ax1.imshow(img_main) ax1.axis('off') ax1.set_title("Main图") # 自动调整子图间距,避免标题/图片重叠 plt.tight_layout() # 将当前画布写入PDF pdf.savefig(fig) # 关闭画布,释放内存 plt.close(fig) # 方案2:每组子图单独保存为独立PDF for idx, row in df.iterrows(): fig, (ax0, ax1) = plt.subplots(1, 2, figsize=(12, 6)) img_id = Image.open(row["identity"]) ax0.imshow(img_id) ax0.axis('off') ax0.set_title("Identity图") img_main = Image.open(row["img"]) ax1.imshow(img_main) ax1.axis('off') ax1.set_title("Main图") plt.tight_layout() # 按行索引命名保存,可自定义命名规则 plt.savefig(f"图片组_{idx}.pdf") plt.close(fig)
关键注意事项
- 必须在每次循环后调用
plt.close(fig),否则大量图片会占用过多内存,导致程序卡顿 figsize参数可根据图片实际分辨率调整,保证保存后的PDF清晰度- 若处理灰度图,可在
imshow中添加cmap="gray"参数优化显示 - 如果图片路径存在缺失,建议在循环中加入异常捕获(如
try-except)避免程序中断
参考知识点
PdfPages类:Matplotlib官方提供的批量PDF生成工具,支持多画布写入、自定义PDF元数据plt.subplots()布局控制:通过nrows/ncols快速生成规则子图网格,返回画布和轴对象PIL.Image读取:支持JPG/PNG等绝大多数常见图片格式,读取后直接适配Matplotlib的imshow方法
内容的提问来源于stack exchange,提问作者user17993062
相关产品推荐
相关产品推荐

