Matplotlib中如何保留平移缩放且仅显示当前图像轮廓?
问题描述
原代码如下:
plt.get_current_fig_manager().full_screen_toggle() for img in imgs: plt.clf() plt.imshow(img, origin='upper', interpolation='None', aspect='equal', cmap='gray') plt.gca().contour(img, np.arange(0, 255, 8), colors='r') while not plt.waitforbuttonpress(): pass
这段代码遍历imgs列表显示连续图像,每张图像都会叠加自身轮廓,但存在矛盾:
- 用
plt.clf()清除画布,切换图像时会丢失之前的平移、缩放状态 - 删掉
plt.clf(),平移缩放状态能保留,但所有历史图像的轮廓会叠加显示,没法只留当前图像的轮廓
解决方案
核心就是别每次清除重绘,而是复用已有的绘图对象,只更新数据:
import matplotlib.pyplot as plt import numpy as np plt.get_current_fig_manager().full_screen_toggle() # 先初始化第一个图像和轮廓,固定用同一个坐标轴 fig, ax = plt.subplots() im = ax.imshow(imgs[0], origin='upper', interpolation='None', aspect='equal', cmap='gray') contour = ax.contour(imgs[0], np.arange(0, 255, 8), colors='r') plt.show(block=False) # 非阻塞显示,让后续代码能执行 # 从第二个图像开始遍历更新 for img in imgs[1:]: # 直接更新图像数据,不重建图像对象 im.set_data(img) # 移除旧轮廓,再画新的 for coll in contour.collections: coll.remove() contour = ax.contour(img, np.arange(0, 255, 8), colors='r') # 刷新画布显示更新内容 fig.canvas.draw_idle() # 等待按键切换图像 while not plt.waitforbuttonpress(): pass
关键说明
- 复用同一个
ax坐标轴对象,平移缩放的状态会一直保留 im.set_data(img)只更新图像像素数据,不会重置轴的状态- 每次切换图像时,先删掉之前的轮廓集合,再重新绘制当前图像的轮廓,避免叠加
fig.canvas.draw_idle()确保画布及时刷新显示最新内容
内容的提问来源于stack exchange,提问作者Paul Jurczak
相关产品推荐
相关产品推荐

