matplotlib调用ax.vlines()绘竖线后原图像消失仅留竖线如何解决
问题原因
核心原因是Matplotlib默认开启坐标轴自动缩放,你调用ax.vlines()时传入的坐标范围超出了原imshow()设置的坐标区间,触发坐标轴自动调整范围,原图像被压缩到极小区域视觉上完全不可见,只剩跨轴的红色竖线。另外代码里还有两处笔误容易触发异常:
imshow()的extent参数里误用了未在函数内定义的image变量,和入参img不一致- 竖线的y轴范围写死为0-2,和你设置的y轴实际范围(0到
img.shape[0]/10)不匹配
修复后代码
直接替换你的函数即可,关键改动加了注释:
def display_image(img, SavePath): vmin, vmax = np.min(img), np.max(img) fig, ax = plt.subplots(figsize=(4, 4)) # 修正笔误:extent里统一用入参img,不要写未定义的image im = ax.imshow(img, cmap='gray', aspect="auto", extent=[0, img.shape[1], img.shape[0]/10, 0], vmin=vmin, vmax=vmax) # 关键:关闭坐标轴自动缩放,避免后续加元素时轴范围被篡改 ax.set_autoscale_on(False) divider = make_axes_locatable(ax) cax = divider.append_axes("right", size="5%", pad=0.05) plt.colorbar(im, ax=ax, cax=cax) # 给tick_params指定操作轴,避免误操作colorbar的轴 ax.tick_params(labelsize=6) for label in ax.get_xticklabels() + ax.get_yticklabels(): label.set_fontsize(6) # 竖线y范围直接用轴的实际上下限,不用写死数值,适配任意尺寸图像 ax.vlines(x=[0, 120, 256], ymin=img.shape[0]/10, ymax=0, colors='r') plt.savefig(SavePath+'Image', facecolor=fig.get_facecolor(), edgecolor=fig.get_edgecolor(), transparent=True) # 避免多图调用时内存泄漏、画布重叠 plt.close(fig)
关键改动说明
- 把
imshow()返回的对象重命名为im,不再覆盖入参img变量,避免变量混淆 - 绘制完图像立刻关闭轴自动缩放,后续加任何标注、线条都不会改变原图的显示范围,超出图像范围的竖线段会被自动裁剪
- 竖线的y轴范围直接取你设置的extent的y轴上下限,不用硬编码数值,不管图像尺寸多大都能从图顶画到图底
- 修正了extent参数里的变量名笔误,给tick_params指定操作的轴,避免误改色条的刻度
- 最后加
plt.close(fig),多次调用函数时不会出现画布重叠、内容串扰的问题
内容的提问来源于stack exchange,提问作者user19333121
相关产品推荐
相关产品推荐

