如何使用matplotlib将嵌套列表内的图像按行展示并修复子图显示异常
问题原因
- 核心错误是把
plt.show()放在了内层循环中,每生成1张子图就立即触发渲染,自然会每张图单独显示,无法合并成多子图的网格 - 原有代码
subplot的行列参数硬编码为3、5,不能灵活适配嵌套列表list_plot的实际行数和每行的图像数量
修复方案
实现逻辑:
- 先计算整个子图网格的参数:总行数等于
list_plot的长度,总列数取所有子列表中最长的长度即可(如果每行图像数量一致,直接取第一个子列表的长度) - 双循环遍历嵌套列表,外层循环控制行号,内层循环控制列号,直接通过行号、列号计算子图位置,不需要单独的计数变量
- 把
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
相关产品推荐
相关产品推荐

