如何将Matplotlib中由固定函数生成的两个图表并排展示?
如何将两个独立生成的Matplotlib图表并排展示
你提到的尝试之所以无效,是因为每个Axes对象天生绑定到它创建时所属的Figure——直接给ax0[0]赋值ax1只是替换了数组里的引用,并没有把ax1从原来的fig1迁移到新的fig0中,所以最终显示的fig0还是空的子图。
下面给你两种可行的解决方案,分别适用于不同场景:
方法一:迁移现有Axes到新的布局Figure
这个方法直接把已生成的Axes从旧Figure移到新的并排布局Figure里,能完整保留原图表的所有样式和元素:
import matplotlib.pyplot as plt # 假设你的plot_data函数已定义 def plot_data(data): fig, ax = plt.subplots(1, figsize=(5, 4)) ax.plot(data) return fig, ax # 生成两个独立图表 data1 = [1, 2, 3, 4, 5] data2 = [5, 4, 3, 2, 1] fig1, ax1 = plot_data(data1) fig2, ax2 = plot_data(data2) # 创建新的1x2布局Figure fig0, axs = plt.subplots(1, 2, figsize=(12, 4)) # 步骤1:把原Axes从旧Figure中移除 fig1.delaxes(ax1) fig2.delaxes(ax2) # 步骤2:将原Axes添加到新Figure,并对齐子图位置 # 处理第一个子图 axs[0].remove() # 先删除新Figure默认生成的空Axes fig0.add_axes(ax1) ax1.set_position(axs[0].get_position()) # 让原Axes匹配新布局的位置 # 处理第二个子图 axs[1].remove() fig0.add_axes(ax2) ax2.set_position(axs[1].get_position()) # 关闭旧的空Figure plt.close(fig1) plt.close(fig2) # 展示最终并排图表 plt.show()
方法二:提取绘图数据,在新布局中重新绘制
如果迁移Axes的方式对你来说太繁琐,可以提取原图表中的绘图元素数据,在新的子图中重新绘制,适合需要微调样式的场景:
import matplotlib.pyplot as plt # 同样先生成两个独立图表 data1 = [1, 2, 3, 4, 5] data2 = [5, 4, 3, 2, 1] fig1, ax1 = plot_data(data1) fig2, ax2 = plot_data(data2) # 创建新的1x2布局 fig0, (ax_left, ax_right) = plt.subplots(1, 2, figsize=(12, 4)) # 复制第一个图表的内容到新子图 for line in ax1.get_lines(): # 提取线条的x/y数据和样式属性 x, y = line.get_xdata(), line.get_ydata() style_props = line.get_properties() ax_left.plot(x, y, **style_props) # 复制标题、坐标轴标签 ax_left.set_title(ax1.get_title()) ax_left.set_xlabel(ax1.get_xlabel()) ax_left.set_ylabel(ax1.get_ylabel()) # 复制第二个图表的内容到新子图 for line in ax2.get_lines(): x, y = line.get_xdata(), line.get_ydata() style_props = line.get_properties() ax_right.plot(x, y, **style_props) ax_right.set_title(ax2.get_title()) ax_right.set_xlabel(ax2.get_xlabel()) ax_right.set_ylabel(ax2.get_ylabel()) # 关闭旧Figure plt.close(fig1) plt.close(fig2) plt.show()
补充说明
- 方法一的优势是完全保留原图表的所有细节(包括图例、注释、自定义样式等),不需要额外处理元素属性;
- 方法二更灵活,如果需要在并排时调整某个子图的样式(比如修改坐标轴范围、添加新元素),可以直接在新子图上操作;
- 无论哪种方法,都要记得关闭旧的Figure,避免不必要的内存占用。
内容的提问来源于stack exchange,提问作者user1128016
相关产品推荐
相关产品推荐

