matplotlib gui imshow坐标

时间:2015-05-14 12:15:56

标签: python matplotlib pyqt4 imshow

我正在使用pyqt4创建一个GUI,其中包含matplotlib使用二维数组显示的图像。如果我用pyplot显示它,如果我将鼠标移到图像上,窗口将显示光标的x,y坐标。但是,当我在imqt GUI中嵌入imshow时,这似乎已经消失了。有没有办法可以让鼠标事件调用一些函数来返回那些鼠标悬停的点的x,y坐标(或者更好的是,那个2d数组的索引)?

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

如果有帮助,这就是我如何嵌入imshow情节。首先,我创建一个基础canvas类,然后从中创建一个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)

1 个答案:

答案 0 :(得分:1)

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

首先将以下行添加到Canvas

的构造函数中
self.mpl_connect('motion_notify_event', self.mouse_moved)

每次鼠标运动时都会调用mouse_moved方法。

mouse_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_moved_signal构造函数中定义Canvas。请注意,mouse_event参数是Matplotlib event,而不是Qt事件。

我建议您阅读Matplotlib文档中的chapter about events以了解可能的内容。