时隔许久重拾Python:批量绘图时如何将每个图表存为独立PDF?
批量保存Matplotlib图表为独立PDF文件的解决方案
嘿,好久没碰Python再捡起来确实容易卡在这种看似简单的小问题上,太懂这种感觉了!针对你批量绘图并保存为独立PDF的需求,咱们直接一步步来解决:
核心思路
你已经拿到了输入文件夹的文件列表,接下来只需要循环处理每个文件:
- 从每个文件提取/计算出对应的x、y数据
- 为每个文件创建独立的Matplotlib图表
- 将图表以PDF格式保存到
output文件夹,文件名和输入文件对应(方便后续查找) - 处理完每个图表后关闭它,避免内存泄漏
完整代码示例
结合你已有的代码,我把完整的实现写出来了,你可以直接套用:
import numpy as np import matplotlib.pyplot as plt import csv import os # 定义输入输出文件夹路径 input_dir = 'input' output_dir = 'output' # 获取输入文件夹下的所有文件 myfiles = os.listdir(input_dir) # 确保输出文件夹存在,不存在则自动创建 os.makedirs(output_dir, exist_ok=True) # 循环处理每个输入文件 for filename in myfiles: # 跳过非目标文件(这里假设你的输入是CSV,可根据实际文件类型修改后缀) if not filename.endswith('.csv'): continue # --- 这里替换成你自己的数据处理逻辑 --- # 示例:读取CSV文件获取x、y数据 with open(os.path.join(input_dir, filename), 'r') as f: csv_reader = csv.reader(f) next(csv_reader) # 跳过表头(如果你的文件没有表头可以删掉这行) x_data = [] y_data = [] for row in csv_reader: x_data.append(float(row[0])) y_data.append(float(row[1])) # --- 绘制独立图表 --- plt.figure() # 为每个文件创建新的图表实例,避免互相覆盖 plt.plot(x_data, y_data, linewidth=2, label='数据曲线') plt.xlabel('X轴名称') plt.ylabel('Y轴名称') plt.title(f'{filename} 数据分析图表') plt.legend() plt.grid(alpha=0.3) # 可选:添加网格让图表更清晰 # --- 保存为PDF文件 --- # 生成对应输出文件名:去掉原文件后缀,替换为.pdf output_filename = f"{os.path.splitext(filename)[0]}.pdf" output_path = os.path.join(output_dir, output_filename) # bbox_inches='tight' 防止图表的标题、标签被截断在PDF边缘 plt.savefig(output_path, format='pdf', bbox_inches='tight', dpi=300) # 关闭当前图表,释放内存(处理大量文件时非常重要) plt.close() print("所有图表已成功保存到output文件夹!")
关键注意点
- 确保输出文件夹存在:用
os.makedirs(output_dir, exist_ok=True)可以自动创建文件夹,不用手动操作,也不会因为文件夹已存在报错 - 独立图表实例:每个循环都调用
plt.figure(),这样每个图表都是独立的,不会出现后一个图表覆盖前一个的情况 - PDF保存细节:
bbox_inches='tight'能避免图表元素被截断,dpi=300可以让PDF图表更清晰(可选) - 关闭图表:处理完每个文件后调用
plt.close(),避免Matplotlib占用过多内存,尤其是处理几十上百个文件时,这个操作能防止程序变慢甚至崩溃 - 文件名对应:用
os.path.splitext(filename)[0]获取不带后缀的原文件名,再加上.pdf,这样每个输入文件和输出PDF一一对应,方便后续查找
内容的提问来源于stack exchange,提问作者user7852656




