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

matplotlib调用ax.vlines()绘竖线后原图像消失仅留竖线如何解决

问题原因

核心原因是Matplotlib默认开启坐标轴自动缩放,你调用ax.vlines()时传入的坐标范围超出了原imshow()设置的坐标区间,触发坐标轴自动调整范围,原图像被压缩到极小区域视觉上完全不可见,只剩跨轴的红色竖线。另外代码里还有两处笔误容易触发异常:

  1. imshow()的extent参数里误用了未在函数内定义的image变量,和入参img不一致
  2. 竖线的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:33:44