Matplotlib如何将已保存的现有绘图组合为多面板子图?
Matplotlib拼接已保存PNG为多面板组合图方案
你的思路是正确的,核心逻辑为读取本地PNG文件为图像数组,再分配到子图网格中渲染,具体实现如下:
依赖库
需要导入matplotlib.pyplot和matplotlib.image两个模块即可完成需求,无需额外安装第三方工具。
可运行示例代码
import matplotlib.pyplot as plt import matplotlib.image as mpimg # 1. 整理选中的待拼接图片路径,顺序对应子图排列顺序 selected_img_paths = [ "spatial_plot_01.png", "spatial_plot_03.png", "spatial_plot_05.png", "spatial_plot_07.png" ] # 2. 定义组合图的行列数,示例为2行2列 row_num = 2 col_num = 2 # 3. 创建画布与子图网格,可通过figsize调整整体尺寸、dpi调整输出清晰度 fig, axs = plt.subplots(nrows=row_num, ncols=col_num, figsize=(12, 9), dpi=150) # 将二维子图数组展平为一维,方便遍历 axs = axs.flatten() for ax, img_path in zip(axs, selected_img_paths): # 读取PNG文件为图像数组,自动保留透明通道 img = mpimg.imread(img_path) # 将图像渲染到对应子图 ax.imshow(img) # 隐藏子图自带的坐标轴与刻度,避免遮挡原有图片内容 ax.axis("off") # 可选:给单个子图添加标题/编号,示例给第一个子图加标注 # axs[0].set_title("2020年空间分布", fontsize=10) # 自动调整子图间距,避免重叠或留白过多 plt.tight_layout() # 保存拼接后的组合图,bbox_inches参数避免边缘内容被裁剪 plt.savefig("combined_spatial_plot.png", bbox_inches="tight") plt.show()
注意事项
- 若图片数量少于子图数量,可手动对多余子图调用
ax.axis("off")隐藏空白坐标轴 - 若需要自定义子图宽高比例,可在
plt.subplots中添加gridspec_kw参数调整,例如gridspec_kw={'height_ratios': [1, 2]}设置两行高度比为1:2 - 若需要读取JPG等其他格式图片,可导入Pillow库的
Image.open读取后转为numpy数组即可,逻辑和上述代码完全一致
内容的提问来源于stack exchange,提问作者Bernard Postema
相关产品推荐
相关产品推荐

