Python matplotlib gui imshow坐标

Python matplotlib gui imshow坐标,python,matplotlib,pyqt4,imshow,Python,Matplotlib,Pyqt4,Imshow,我正在使用pyqt4制作一个GUI,其中包含matplotlib的imshow使用2d数组显示的图像。如果我用pyplot显示,如果我在图像上移动鼠标,窗口将显示光标的x,y坐标。然而,当我将imshow嵌入pyqt GUI时,这似乎已经消失了。有没有一种方法可以让鼠标事件调用某个函数,该函数返回鼠标悬停点的x、y坐标(或者更好的是,该2d数组的索引) 编辑:我找到了wx的文档,但我仍然不知道如何为我的GUI做到这一点 如果有帮助的话,下面是我如何嵌入imshow情节的。首先,我创建了一个基本画

我正在使用pyqt4制作一个GUI,其中包含matplotlib的imshow使用2d数组显示的图像。如果我用pyplot显示,如果我在图像上移动鼠标,窗口将显示光标的x,y坐标。然而,当我将imshow嵌入pyqt GUI时,这似乎已经消失了。有没有一种方法可以让鼠标事件调用某个函数,该函数返回鼠标悬停点的x、y坐标(或者更好的是,该2d数组的索引)

编辑:我找到了wx的文档,但我仍然不知道如何为我的GUI做到这一点

如果有帮助的话,下面是我如何嵌入imshow情节的。首先,我创建了一个基本画布类,然后在此基础上为imshow创建了一个类:

class Canvas(FigureCanvas):
    def __init__(self, parent = None, width = 5, height = 5, dpi = 100, projection = None):
        self.fig = Figure(figsize = (width, height), dpi = dpi)
        if projection:
            self.axes = Axes3D(self.fig)
        else:
            self.axes = self.fig.add_subplot(111)

        self.axes.tick_params(axis = 'both', which = 'major', labelsize = 8)
        self.axes.tick_params(axis = 'both', which = 'minor', labelsize = 8)
        self.compute_initial_figure()
        FigureCanvas.__init__(self, self.fig)
        self.setParent(parent)
        FigureCanvas.setSizePolicy(self, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        FigureCanvas.updateGeometry(self)

    def compute_initial_figure(self):
        pass

class TopView(Canvas):
    def __init__(self, *args, **kwargs):
        Canvas.__init__(self, *args, **kwargs)
        self.divider = make_axes_locatable(self.axes)
        self.cax = self.divider.append_axes("bottom", size = "5%", pad = 0.2)

    def compute_initial_figure(self):
        self.top = self.axes.imshow(zarr, interpolation = 'none', extent = [xmin, xmax, ymin, ymax], origin = 'lower')
        self.top.set_cmap('nipy_spectral')
        self.top.set_clim(vmin = pltMin, vmax = pltMax)
然后,在主窗口中,我创建对象并将其放置在网格布局中:

tv = TopView(self.main_widget, width = 4, height = 3, dpi = 100)
self.g.addWidget(tv, 1, 2, 3, 1)

Matplotlib使用自己的事件,因此它们独立于UI工具包(wx windows、Qt等)。因此,很容易适应Qt,就像您的情况一样

首先将以下行添加到
Canvas
类的构造函数中

self.mpl_connect('motion_notify_event', self.mouse_moved)
这将在每次鼠标移动时调用mouse_moved方法

mouse\u moved
方法中,您可以发出一个连接到知道如何显示鼠标坐标的小部件的Qt信号。大概是这样的:

def mouse_moved(self, mouse_event):
    if mouse_event.inaxes:
        x, y = mouse_event.xdata, mouse_event.ydata
        self.mouse_moved_signal.emit(x,y)
当然,您还必须在
画布
构造函数中定义
鼠标移动信号
。请注意,
mouse\u事件
参数是一个事件,而不是一个Qt事件

我建议您阅读Matplotlib文档中的,以了解可能的情况