Python 在matplotlib图形窗口(使用imshow)中,如何删除、隐藏或重新定义鼠标的显示位置?

Python 在matplotlib图形窗口(使用imshow)中,如何删除、隐藏或重新定义鼠标的显示位置?,python,matplotlib,ipython,Python,Matplotlib,Ipython,我将ipython与matplotlib一起使用,并以以下方式显示图像: (由:ipython--pylab启动) 现在,当我在图像上移动光标时,我看到鼠标的位置显示在figure窗口的左下角。显示的数字是x=列编号,y=行编号。这是非常以情节为导向的,而不是以图像为导向的。我可以修改显示的数字吗 我的第一个选择是显示x=行数*标量,y=列数*标量 我的第二个选择是显示x=行编号,y=列编号 我的第三个选择是根本不显示鼠标位置的数字 我能做这些事情吗?我甚至不知道该怎么称呼这个鼠标悬停测试显示小

我将ipython与matplotlib一起使用,并以以下方式显示图像:

(由:ipython--pylab启动)

现在,当我在图像上移动光标时,我看到鼠标的位置显示在figure窗口的左下角。显示的数字是x=列编号,y=行编号。这是非常以情节为导向的,而不是以图像为导向的。我可以修改显示的数字吗

  • 我的第一个选择是显示x=行数*标量,y=列数*标量
  • 我的第二个选择是显示x=行编号,y=列编号
  • 我的第三个选择是根本不显示鼠标位置的数字

  • 我能做这些事情吗?我甚至不知道该怎么称呼这个鼠标悬停测试显示小部件。谢谢

    是的,你可以。但这比你想象的要难

    您看到的鼠标跟踪标签是通过调用matplotlib.axes.axes.format_coord来响应鼠标跟踪而生成的。您必须创建自己的Axis类(覆盖format_coord以执行您希望它执行的操作),然后指示matplotlib使用它来代替默认的Axis类

    具体而言:

    创建自己的Axes子类 注册Axes子类 创建一个图形,并使用自定义轴 像以前一样绘制数据
    通过简单地重新分配
    对象的
    格式协调
    ,可以在每个轴的基础上非常简单地执行此操作,如中所示

    format_-coord
    是任何函数,它接受两个参数(x,y)并返回一个字符串(然后显示在图上)

    如果不想显示,只需执行以下操作:

    ax.format_coord = lambda x, y: ''
    
    如果只需要行和列(不勾选)

    如果您想在制作的每个iimage上执行此操作,只需定义包装器函数

    def imshow(img, scale_val=1, ax=None, *args, **kwargs):
        if ax is None:
             ax = plt.gca()
        im = ax.imshow(img, *args, **kwargs)
        ax.format_coord = lambda x, y: 'r=%d,c=%d' % (scale_val * int(x + .5), 
                                                 scale_val * int(y + .5))
        ax.figure.canvas.draw()
        return im
    

    在没有太多测试的情况下,我认为应该或多或少地取代
    plt.imshow

    这是可行的,但有更简单的方法。
    from matplotlib.projections import projection_registry
    projection_registry.register(MyRectilinearAxes)
    
    figure()
    subplot(111, projection="MyRectilinearAxes")
    
    im = zeros([256,256]) #just a stand-in for my real images
    imshow(im)
    
    ax.format_coord = lambda x, y: ''
    
    scale_val = 1
    ax.format_coord = lambda x, y: 'r=%d,c=%d' % (scale_val * int(x + .5), 
                                                 scale_val * int(y + .5))
    
    def imshow(img, scale_val=1, ax=None, *args, **kwargs):
        if ax is None:
             ax = plt.gca()
        im = ax.imshow(img, *args, **kwargs)
        ax.format_coord = lambda x, y: 'r=%d,c=%d' % (scale_val * int(x + .5), 
                                                 scale_val * int(y + .5))
        ax.figure.canvas.draw()
        return im