Python 如何在PyQt应用程序中使用鼠标在绘图内移动直线

Python 如何在PyQt应用程序中使用鼠标在绘图内移动直线,python,matplotlib,pyqt,Python,Matplotlib,Pyqt,我想在PyQt应用程序中显示一个给定的绘图,并显示一条随着鼠标光标移动的线。但是,该线显示在绘图的左侧,并且在移动光标时根本不移动。我不知道为什么会这样。代码如下: import numpy as np from matplotlib.backends.qt_compat import QtWidgets from matplotlib.backends.backend_qt5agg import FigureCanvas from matplotlib.figure import Figure

我想在PyQt应用程序中显示一个给定的绘图,并显示一条随着鼠标光标移动的线。但是,该线显示在绘图的左侧,并且在移动光标时根本不移动。我不知道为什么会这样。代码如下:

import numpy as np
from matplotlib.backends.qt_compat import QtWidgets
from matplotlib.backends.backend_qt5agg import FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt

class SnaptoCursor(object):
    def __init__(self, ax, x):
        self.ax = ax
        self.ly = ax.axvline(color='k')
        self.x = x
        self.txt = ax.text(0.7, 0.9, '', transform=ax.transAxes)

    def mouse_move(self, event):
        if event.inaxes:
            indx = np.searchsorted(self.x, [event.xdata])[0]
            x = self.x[indx]
            self.ly.set_xdata(x)
            self.txt.set_text('x=%1.2f' % x)
            self.ax.figure.canvas.draw()
        else:
            pass

class App(QtWidgets.QMainWindow):         
    def __init__(self, parent=None):
        super(App, self).__init__(parent)

        self._main = QtWidgets.QWidget()
        self.setCentralWidget(self._main)
        self.figure = Figure(figsize=(10, 6.9))
        self.canvas = FigureCanvas(self.figure)
        self.canvas_ax = self.canvas.figure.subplots()
        x = np.arange(0,40)
        self.canvas_ax.plot(x, np.random.rand(40))

        # Layout
        layout = QtWidgets.QVBoxLayout(self._main)
        layout.addWidget(self.canvas)
        self.showMaximized()

        ##############################################
        ########## This doesnt seem to work ##########
        ##############################################
        cursor = SnaptoCursor(self.canvas_ax, x)
        plt.connect('motion_notify_event', cursor.mouse_move)
        ##############################################
        ##############################################
        ##############################################

if __name__ == '__main__':   
    app = QtWidgets.QApplication([])   
    ex = App()
    ex.show()
    app.exec_()

这两条线应该是

self.cursor = SnaptoCursor(self.canvas_ax, x)
self.cid = self.canvas.mpl_connect('motion_notify_event', self.cursor.mouse_move)
因为在其他情况下,游标和回调注册在您希望使用它们的位置不存在于内存中。而且,当您的图形甚至没有使用pyplot创建时,您也不应该使用pyplot/plt