如何将两个已有matplotlib Figure高质量并排拼接且不修改原图生成逻辑
Matplotlib两个已生成Figure横向高保真拼接方案
核心思路
无需修改原有绘图的生成逻辑,直接提取已有Figure的渲染数据绘制到新画布上,完全保留原始图像的分辨率/矢量属性,不会出现拼接后质量下降的问题。
实现代码
import matplotlib.pyplot as plt import numpy as np # 读取原有Figure的dpi参数,保证拼接后尺寸完全匹配 origin_dpi = fig1.dpi # 创建目标画布:宽度2000px,高度1000px,dpi和原图保持一致 # figsize单位为英寸,需通过像素值/dpi换算得到 new_fig = plt.figure( figsize=(2000 / origin_dpi, 1000 / origin_dpi), dpi=origin_dpi ) # 定义左右两个无边界子图区域,各占50%宽度 ax_left = new_fig.add_axes([0, 0, 0.5, 1]) ax_right = new_fig.add_axes([0.5, 0, 0.5, 1]) # 隐藏子图坐标轴,避免遮挡原有内容 ax_left.axis('off') ax_right.axis('off') # 渲染左侧图像(fig1)并绘制到左区域 fig1.canvas.draw() left_img = np.array(fig1.canvas.renderer.buffer_rgba()) ax_left.imshow(left_img) # 渲染右侧图像(fig2)并绘制到右区域 fig2.canvas.draw() right_img = np.array(fig2.canvas.renderer.buffer_rgba()) ax_right.imshow(right_img) # 导出拼接结果,pad_inches设为0去除多余白边 # 可保存为svg/pdf等矢量格式实现无损拼接 new_fig.savefig( "merged_figure.png", dpi=origin_dpi, bbox_inches="tight", pad_inches=0 )
注意事项
- 操作前不要调用
plt.close()关闭fig1、fig2,否则无法读取渲染数据 - 如果两个原有Figure的dpi不同,可手动将
origin_dpi设为统一值,避免尺寸变形 - 如需在两张图之间留空隙,可调整
add_axes的坐标参数,例如将右区域起始位置设为0.52,宽度设为0.48即可留出2%宽度的间隙
内容的提问来源于stack exchange,提问作者jonb
相关产品推荐
相关产品推荐

