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
相关产品推荐
相关产品推荐

