12

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

(开始于: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 回答 2

9

您可以通过简单地重新分配对象来在每个轴的基础上非常简单地执行此操作format_coordAxes示例中所示。

format_coord是任何接受 2 个参数 (x,y) 并返回一个字符串(然后显示在图上)的函数。

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

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))

如果你想在你制作的每个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

于 2013-01-16T04:55:40.403 回答
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)
于 2013-01-16T01:46:55.567 回答