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

如何使用matplotlib将嵌套列表内的图像按行展示并修复子图显示异常

问题原因
  • 核心错误是把plt.show()放在了内层循环中,每生成1张子图就立即触发渲染,自然会每张图单独显示,无法合并成多子图的网格
  • 原有代码subplot的行列参数硬编码为3、5,不能灵活适配嵌套列表list_plot的实际行数和每行的图像数量
修复方案

实现逻辑:

  1. 先计算整个子图网格的参数:总行数等于list_plot的长度,总列数取所有子列表中最长的长度即可(如果每行图像数量一致,直接取第一个子列表的长度)
  2. 双循环遍历嵌套列表,外层循环控制行号,内层循环控制列号,直接通过行号、列号计算子图位置,不需要单独的计数变量
  3. 把plt.show()移到所有循环结束之后,所有子图绘制完成后再统一渲染

如果你的每行图像数量一致(大部分场景都是这种情况),可以直接用以下代码:

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

# 先计算网格行列参数
row_num = len(list_plot)
col_num = len(list_plot[0])

# 可按需调整画布大小,此处按每张小图宽3英寸、高3英寸计算
plt.figure(figsize=(col_num*3, row_num*3))

for row_idx, query in enumerate(list_plot):
    for col_idx, qm_images in enumerate(query):
        # 子图位置序号从1开始,按行顺序计数
        current_pos = row_idx * col_num + col_idx + 1
        plt.subplot(row_num, col_num, current_pos)
        plt.imshow(np.array(Image.open(qm_images)))
        # 不需要展示坐标轴可以保留下面这行,需要的话删掉即可
        plt.axis('off')

# 自动调整子图间距避免内容重叠
plt.tight_layout()
# 所有子图绘制完成后统一显示
plt.show()

如果每行图像数量不一致,仅需要把col_num修改为所有子列表的最大长度即可,空出来的子图位置会自动留白。

内容的提问来源于stack exchange,提问作者Klinda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:36:03