如何用代码将循环生成的所有Plotly图表批量导出为PDF?
直接将Plotly批量生成的图表合并为单个PDF的解决方案
核心思路
跳过导出PNG再转PDF的低效步骤,直接将Plotly图表生成PDF格式的字节流,通过PyPDF2合并所有字节流为单一PDF文件,大幅节省时间和IO开销。
所需依赖
先安装必要的库:
pip install plotly kaleido PyPDF2
kaleido是Plotly导出PDF等矢量格式的必需依赖PyPDF2用于合并多个PDF字节流
修改后的完整代码
首先确保你的绘图函数(graph1a()、graph2()等)返回生成的Plotly Figure对象,比如:
import plotly.graph_objects as go def graph1a(): # 你的绘图逻辑 fig = go.Figure(data=[go.Bar(x=[1,2,3], y=[4,5,6])]) # 其他布局设置... return fig
然后修改主循环代码:
import plotly.io as pio from PyPDF2 import PdfMerger import io # 初始化PDF合并器 pdf_merger = PdfMerger() count = 0 # 遍历所有机构(你原代码中用了[20:21]测试,实际使用时可去掉切片) for o in new_df['origin'].unique(): origin_df = new_df.loc[new_df['origin'] == o] # 获取每个机构的7张图表对象 figs = [ graph1a(), graph2(), graph3a(), graph4(), graph5(), graph6a(), graph777() ] # 将每张图表转为PDF字节流并加入合并器 for fig in figs: # 直接生成PDF格式的字节流 pdf_byte_data = pio.to_image(fig, format='pdf') # 包装为可被PyPDF2读取的文件对象 pdf_stream = io.BytesIO(pdf_byte_data) pdf_merger.append(pdf_stream) count += 1 print(f"完成第{count}个机构的图表处理") # 保存最终的汇总PDF pdf_merger.write("机构图表汇总.pdf") pdf_merger.close()
关键说明
- 无需生成任何中间PNG文件,所有转换和合并都在内存中完成,速度远快于磁盘IO操作
- 必须保证绘图函数返回Figure对象,如果原函数没有返回值,一定要补充
return fig pio.to_image直接生成PDF矢量图,比转PNG再转PDF的画质更清晰,文件体积也更小
内容的提问来源于stack exchange,提问作者Deeda
相关产品推荐
相关产品推荐

