Jupyter Notebook中如何将Matplotlib生成的多图合并为单个子图保存?
解决Jupyter Notebook中合并Matplotlib子图的问题
直接赋值Axes对象行不通的原因很明确:每个Axes实例绑定在创建它的原始Figure上,你只是把newax[0]的变量指向改成了旧的prevax0,并没有把旧Axes的内容迁移到新Figure的子图中,所以新Figure只会显示空白。
下面提供两种可行的解决方案:
方案1:保存绘图数据,重新绘制(推荐)
这是最稳定可靠的方式,把每个单元格里绘图用到的数据、样式参数保存下来,最后在新的Figure里重新绘制子图。
示例步骤:
- 前面的单元格中,保存绘图数据和原Axes的样式信息:
import matplotlib.pyplot as plt import numpy as np # 第一个绘图单元格 x = np.linspace(0, 10, 100) y_sin = np.sin(x) fig1, ax_sin = plt.subplots() ax_sin.plot(x, y_sin) ax_sin.set_title('正弦曲线') ax_sin.set_ylabel('sin(x)') plt.show() # 第二个绘图单元格 y_cos = np.cos(x) fig2, ax_cos = plt.subplots() ax_cos.plot(x, y_cos) ax_cos.set_title('余弦曲线') ax_cos.set_xlabel('x') ax_cos.set_ylabel('cos(x)') plt.show()
- 最后单元格中,用保存的数据重新绘制合并子图:
# 创建包含2个子图的新Figure fig_combined, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 7)) # 重新绘制第一个子图,并复制原样式 ax1.plot(x, y_sin) ax1.set_title(ax_sin.get_title()) ax1.set_ylabel(ax_sin.get_ylabel()) # 重新绘制第二个子图,并复制原样式 ax2.plot(x, y_cos) ax2.set_title(ax_cos.get_title()) ax2.set_xlabel(ax_cos.get_xlabel()) ax2.set_ylabel(ax_cos.get_ylabel()) # 自动调整子图间距 plt.tight_layout() # 保存为单个文件 plt.savefig('combined_plots.png', dpi=150) plt.show()
方案2:将原有图表转为图像,在新子图中显示
如果不想重新编写绘图代码,可以把每个原有Figure渲染成图像,再放到新的子图中展示:
import matplotlib.pyplot as plt from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas import numpy as np # 假设前面已经创建了fig1(正弦图)和fig2(余弦图) fig_combined, (ax_a, ax_b) = plt.subplots(2, 1, figsize=(8, 7)) # 处理第一个图:转为图像后显示 canvas1 = FigureCanvas(fig1) canvas1.draw() img1 = np.array(canvas1.renderer.buffer_rgba()) ax_a.imshow(img1) ax_a.axis('off') # 隐藏额外坐标轴,因为图像已包含原图表的坐标轴 # 处理第二个图:转为图像后显示 canvas2 = FigureCanvas(fig2) canvas2.draw() img2 = np.array(canvas2.renderer.buffer_rgba()) ax_b.imshow(img2) ax_b.axis('off') plt.tight_layout() plt.savefig('combined_images.png', dpi=150) plt.show()
内容的提问来源于stack exchange,提问作者Skeksis
相关产品推荐
相关产品推荐

