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

时间:2013-01-16 00:06:43

标签: python matplotlib ipython

我正在使用带有matplotlib的ipython,我以这种方式显示图像:

(启动时:ipython --pylab)

figure()  
im = zeros([256,256]) #just a stand-in for my real images   
imshow(im)

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

  1. 我的第一选择是显示x =行号*标量,y =列号*标量
  2. 我的第二选择是显示x =行号,y =列号
  3. 我的第三个选择是不显示鼠标位置的数字
  4. 我可以做这些事情吗?我甚至不确定将鼠标悬停测试显示小部件称为什么。谢谢!

2 个答案:

答案 0 :(得分:8)

您只需在每个轴上完成此操作,只需重新分配format_coord Axes对象format_coord,如examples所示。

ax.format_coord = lambda x, y: '' 是任意函数,它接受2个参数(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

如果你想在你做的每个 iimage上做这件事,只需定义包装函数

plt.imshow

经过多次测试我认为应该或多或少地替代{{1}}

答案 1 :(得分:3)

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

您看到的鼠标跟踪标签是通过调用matplotlib.axes.Axes.format_coord生成的,以响应鼠标跟踪。你必须创建自己的Axes类(重写format_coord来做你想做的事情),然后指示matplotlib使用它代替默认的。

具体做法是:

创建自己的Axes子类

from matplotlib.axes import Axes
class MyRectilinearAxes(Axes):
    name = 'MyRectilinearAxes'
    def format_coord(self, x, y):
        # Massage your data here -- good place for scalar multiplication
        if x is None:
            xs = '???'
        else:
            xs = self.format_xdata(x * .5)
        if y is None:
            ys = '???'
        else:
            ys = self.format_ydata(y * .5)
        # Format your label here -- I transposed x and y labels
        return 'x=%s y=%s' % (ys, xs)

注册Axes子类

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)