如何在Python中无需重绘即可并排/叠加展示已绘制的Matplotlib图形
在Jupyter Notebook中并排展示已有的Matplotlib图形对象
下面提供两种无需重新绘制图形的实现方式,适配你的需求:
方法一:转为静态图片并排展示(简单通用)
这种方式无需修改原图形的绘制逻辑,直接将已保存的fig1、fig2转为图片后并排显示,适配所有类型的Matplotlib图形:
from IPython.display import display, Image import io # 把fig1转为内存中的图片对象 buf1 = io.BytesIO() fig1.savefig(buf1, format='png') buf1.seek(0) img1 = Image(buf1) # 把fig2转为内存中的图片对象 buf2 = io.BytesIO() fig2.savefig(buf2, format='png') buf2.seek(0) img2 = Image(buf2) # 并排展示两张图片 display(img1, img2)
方法二:保留交互性的图形合并
如果需要保留Matplotlib图形的交互功能(比如缩放、平移),可以创建新画布,将原有图形的元素复制到新画布的子图中:
import matplotlib.pyplot as plt # 创建1行2列的新画布 new_fig, (ax_left, ax_right) = plt.subplots(1, 2, figsize=(12, 5)) # 复制fig1的图形元素到左侧子图 src_ax1 = fig1.axes[0] for line in src_ax1.get_lines(): ax_left.plot(line.get_xdata(), line.get_ydata(), **line.get_properties()) # 同步坐标轴标签、标题等属性 ax_left.set_xlabel(src_ax1.get_xlabel()) ax_left.set_ylabel(src_ax1.get_ylabel()) ax_left.set_title(src_ax1.get_title()) ax_left.legend(src_ax1.get_legend_handles_labels()[0], src_ax1.get_legend_handles_labels()[1]) # 复制fig2的图形元素到右侧子图 src_ax2 = fig2.axes[0] for line in src_ax2.get_lines(): ax_right.plot(line.get_xdata(), line.get_ydata(), **line.get_properties()) ax_right.set_xlabel(src_ax2.get_xlabel()) ax_right.set_ylabel(src_ax2.get_ylabel()) ax_right.set_title(src_ax2.get_title()) ax_right.legend(src_ax2.get_legend_handles_labels()[0], src_ax2.get_legend_handles_labels()[1]) # 自动调整布局 new_fig.tight_layout() plt.show()
注:方法二如果原图形包含注释、色块等复杂元素,需要针对性补充复制逻辑,适合结构简单的图形场景。
内容的提问来源于stack exchange,提问作者akopty
相关产品推荐
相关产品推荐

