0

I want to show a given plot inside a PyQt application and show a line that moves along with the mouse cursor. However, the line shows up on the left of the plot and doesn't move at all when moving the cursor. I don't know why this is happening. Here's the code:

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

1 Answer 1

1

The two lines in question should be

self.cursor = SnaptoCursor(self.canvas_ax, x)
self.cid = self.canvas.mpl_connect('motion_notify_event', self.cursor.mouse_move)

because else the cursor as well as the callback registration do not exist in memory at the point you would expect them to be used. And also you shouldn't be using pyplot/plt when your figure isn't even created with pyplot.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.