You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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)

(效果:子图带有多余坐标轴,子图间距不合理)

最优解决方案

可以通过以下操作解决你的问题:

  1. 隐藏多余坐标轴:对每个子图调用axis('off')方法,移除坐标轴、刻度及边框。
  2. 调整子图间距:通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 06:15:45