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

Python Matplotlib如何将2个figure对象保存至同一PDF页面

解决方案

问题根源是你每次调用create_DNA_logo时没有指定绘图用的坐标轴,logomaker会自动为每个logo生成独立的figure对象;后续两次调用pdf.savefig()会分别把两个独立figure写入PDF的不同页面。

最简便的实现方式是提前创建一个包含两个子图的共用figure,创建两个logo时直接指定在对应的子图上绘制,最后只需要调用一次savefig保存这个共用figure,两个logo就会出现在同一PDF页面。

具体实现代码

你只需要修改循环内的逻辑,提前创建子图,创建logo时传入对应ax参数即可:

if (output_pdf_name is not None):
    pdf = matplotlib.backends.backend_pdf.PdfPages(output_pdf_name)
    explained_seq_fetures_letters_list1 = explained_seq_fetures_letters1 if multiple_samples else [explained_seq_fetures_letters1]
    explained_seq_fetures_letters_list2 = explained_seq_fetures_letters2 if multiple_samples else [explained_seq_fetures_letters2]

    for item1, item2 in zip(explained_seq_fetures_letters_list1, explained_seq_fetures_letters_list2):
        # 新建包含2个上下子图的figure,figsize可根据你的logo长度按需调整
        fig, (ax_top, ax_bottom) = plt.subplots(nrows=2, ncols=1, figsize=(12, 7), tight_layout=True)
        
        # 绘制第一个logo到上方子图
        df1 = pd.DataFrame(item1, columns=Logo_letters)
        logo1 = create_DNA_logo(PWM_df=df1, secondary_color=secondary_color, ax=ax_top)
        
        # 处理并绘制第二个logo到下方子图
        item2_processed = item2[item2 != 0].reshape(-1, 1)
        df2 = pd.DataFrame(item2_processed, columns=Logo_symbol)
        logo2 = create_DNA_logo(PWM_df=df2, secondary_color=True, ax=ax_bottom)
        
        # 仅保存一次共用figure,两个logo同属一页
        pdf.savefig(fig)
        plt.close(fig)
    pdf.close()

注意事项

  • 如果你的create_DNA_logo自定义函数目前不接收ax参数,只需要在函数定义中新增ax入参,把该参数传给内部调用的logomaker.Logo初始化方法即可,logomaker原生支持自定义坐标轴传入,改动量极小。
  • 如果需要两个logo左右排列,把plt.subplots的参数改成nrows=1, ncols=2,同时对应调整figsize的宽高比例即可。
  • 加上tight_layout=True可以自动调整子图间距,避免两个logo的坐标轴标签、标题互相遮挡。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 00:57:25