You need to enable JavaScript to run this app. 在Jupyter Notebook单个单元格中如何同时展示多张图像
优惠活动
大模型
产品
解决方案
定价
更多

在Jupyter Notebook单个单元格中如何同时展示多张图像

核心问题成因

matplotlib 默认会复用全局的当前画布与坐标轴对象,同一段循环代码中连续调用的 pyplot.imshow(),都会把绘制内容堆到同一个显示区域里;同时Jupyter 对 matplotlib 的渲染逻辑是:单个单元格内的全部代码执行完毕后,才统一输出一次最终的画布内容。两种机制叠加后,循环里前两次 imshow 绘制的内容会被第三次的操作覆盖,最终单元格就只会显示最后一张图。
这不是你记错了 imshow 的基础用法,是没有主动拆分独立绘制区域、触发分段渲染导致的。

常用解决方法

方法1:子图网格统一排布(首选)

提前按照待展示的图像数量创建独立的子图轴网格,将每一张图绘制到对应的专属轴上,最后统一渲染输出,布局整齐、无多余留白:

import cv2
from matplotlib import pyplot

file_names = ['a', 'b', 'c']
# 创建1行N列的子图布局,一次性生成所有独立坐标轴对象
fig, axes = pyplot.subplots(nrows=1, ncols=len(file_names), figsize=(15, 5))
for ax, name in zip(axes, file_names):
    image = cv2.imread(name)
    # OpenCV读取图像默认是BGR通道顺序,需转换为RGB顺序才能适配matplotlib的显示要求
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    ax.imshow(image_rgb)
    # 关闭子图坐标轴,让图像展示更清爽
    ax.axis('off')
# 统一渲染整个画布
pyplot.show()

方法2:循环内新建独立画布并即时渲染

如果需要每一张图像独立成块、不挤在同一张网格里,可以在每次循环时新建独立画布,绘制完成后主动触发渲染,避免内容叠加覆盖:

import cv2
from matplotlib import pyplot

file_names = ['a', 'b', 'c']
for name in file_names:
    # 每次循环新建独立画布,和之前的画布完全隔离
    pyplot.figure()
    image = cv2.imread(name)
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    pyplot.imshow(image_rgb)
    pyplot.axis('off')
    # 主动调用show(),让当前画布立即渲染输出,不会被后续新建的画布覆盖
    pyplot.show()
补充说明

你之前把每段 imshow 逻辑拆到独立单元格运行时可以正常显示所有图像,本质是每个单元格执行完成后,Jupyter 都会自动触发一次 matplotlib 的渲染流程,每一次 imshow 都对应独立的输出时机,自然不会出现跨代码块的内容覆盖问题。

额外提示:如果在本地普通Python脚本里写循环调用 imshow,不主动调用 pyplot.show() 是完全不会弹出任何图像窗口的,Jupyter 环境的自动渲染机制是做了特殊适配的,和原生脚本的行为有细微差异。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 17:54:05