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

如何用代码将循环生成的所有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()

关键说明

  1. 无需生成任何中间PNG文件,所有转换和合并都在内存中完成,速度远快于磁盘IO操作
  2. 必须保证绘图函数返回Figure对象,如果原函数没有返回值,一定要补充return fig
  3. pio.to_image直接生成PDF矢量图,比转PNG再转PDF的画质更清晰,文件体积也更小

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:32:19