如何将6张PNG绘图合并为2行3列的Python复合图?
问题描述
我用Python脚本生成了6张PNG格式的绘图,生成脚本如下:
import numpy as np import matplotlib.pyplot as plt plot_num=6 for num in np.arange(plot_num): fig, ax = plt.subplots() x=np.arange(10) y=np.random.rand(10,) plt.plot(x,y, marker='o',mfc='red') plt.savefig('plot_'+str(num)+'.png')
我希望读取这些已保存的绘图,生成一张2行3列的复合图。现有尝试代码能实现大致效果,但会显示额外坐标轴,也不知道怎么调整子图间的横竖间距,求最优解决方案。
尝试代码:
import matplotlib.pyplot as plt from PIL import Image from IPython.display import Image, display fig,ax = plt.subplots(2,3) filenames=['plot_{}.png'.format(i) for i in range(6)] for i in range(6): with open(filenames[i],'rb') as f: image=Image.open(f) ax[i%2][i//2].imshow(image) display(fig)
(效果:子图带有多余坐标轴,子图间距不合理)
最优解决方案
可以通过以下操作解决你的问题:
- 隐藏多余坐标轴:对每个子图调用
axis('off')方法,移除坐标轴、刻度及边框。 - 调整子图间距:通过
fig.subplots_adjust()手动控制横竖间距,或使用tight_layout()自动优化布局。
优化后的完整代码:
import matplotlib.pyplot as plt from PIL import Image from IPython.display import display # 创建2行3列子图,设置整体画布尺寸 fig, axs = plt.subplots(2, 3, figsize=(12, 8)) # 扁平化子图数组,简化遍历逻辑 axs = axs.flatten() filenames = [f'plot_{i}.png' for i in range(6)] for ax, filename in zip(axs, filenames): img = Image.open(filename) ax.imshow(img) # 隐藏当前子图的坐标轴 ax.axis('off') # 手动调整子图间距:wspace为横向间距,hspace为纵向间距,取值0-1 fig.subplots_adjust(wspace=0.1, hspace=0.1) # 若无需手动控制,可替换为自动优化布局 # plt.tight_layout() display(fig)
关键细节说明
- 扁平化子图数组:
axs.flatten()将2×3的二维子图数组转为一维,避免复杂的索引计算,遍历更便捷。 - 隐藏坐标轴:
ax.axis('off')完全隐藏子图的坐标轴元素,让复合图视觉更整洁。 - 间距调整方案:
subplots_adjust(wspace, hspace):手动设置间距,数值越小子图间距越紧凑,可根据实际需求微调。tight_layout():自动调整子图位置与间距,确保所有元素不重叠,适合快速实现整洁布局。
内容的提问来源于stack exchange,提问作者len
相关产品推荐
相关产品推荐

