python - How to display a value in a PyQt text field using matplotlib's object picking function? -


i using pyqt 4 basic gui , matplotlib plot want read coordinates of plotted data points. based on these examples (simple picking example), have simple problem cannot display coordinates of data point in text field such qtgui.qlabel(). not understand why cannot call instance window.msg in method onpick(). because instance not given method. have basic understanding of object oriented programming (but working on it), problem lack of knowledge.

my question: how display coordinates of chosen data (by clicking on it) matplotlib plot in gui based on pyqt (in case in label lbl)?

also, nice highlight chosen data point in plot.

here code (working):

import numpy np import matplotlib.pyplot plt pyqt4 import qtgui import sys matplotlib.backends.backend_qt4agg import figurecanvasqtagg figurecanvas matplotlib.backends.backend_qt4agg import navigationtoolbar2qtagg navigationtoolbar import matplotlib.pyplot plt   class window(qtgui.qdialog):     def __init__(self, parent=none):         super(window, self).__init__(parent)         self.initui()      def initui(self):          self.msg = '0'         # figure instance plot on        self.figure = plt.figure()        self.canvas = figurecanvas(self.figure)        self.toolbar = navigationtoolbar(self.canvas, self)         # label        self.lbl = qtgui.qlabel(self.msg)         # set layout        layout = qtgui.qvboxlayout()        layout.addwidget(self.toolbar)        layout.addwidget(self.canvas)        layout.addwidget(self.lbl)        self.setlayout(layout)         self.plot()      def plot(self):         # random data         data = [np.random.random() in range(10)]         # create axis         ax = self.figure.add_subplot(111)         # discards old graph         ax.hold(false)         # plot data         line, = ax.plot(data, 'o', picker=5)  # 5 points tolerance         self.canvas.draw()         self.canvas.mpl_connect('pick_event',  window.onpick)      def onpick(self):         thisline = self.artist         xdata = thisline.get_xdata()         ydata = thisline.get_ydata()         ind = self.ind          # show data         self.msg = (xdata[ind], ydata[ind])         print(self.msg)          # not work:         #window.lbl.settext(self.msg)   if __name__ == '__main__':     app = qtgui.qapplication(sys.argv)     main = window()     main.show()     sys.exit(app.exec_()) 

the self being overlapped picker (not sure why). in case should work:

import numpy np import matplotlib.pyplot plt pyqt4 import qtgui import sys matplotlib.backends.backend_qt4agg import figurecanvasqtagg figurecanvas matplotlib.backends.backend_qt4agg import navigationtoolbar2qtagg navigationtoolbar import matplotlib.pyplot plt  class window(qtgui.qdialog):     def __init__(self, parent=none):         super(window, self).__init__(parent)         self.initui()      def initui(self):          self.msg = '0'         # figure instance plot on        self.figure = plt.figure()        self.canvas = figurecanvas(self.figure)        self.toolbar = navigationtoolbar(self.canvas, self)         # label        self.lbl = qtgui.qlabel(self.msg)         # set layout        layout = qtgui.qvboxlayout()        layout.addwidget(self.toolbar)        layout.addwidget(self.canvas)        layout.addwidget(self.lbl)        self.setlayout(layout)         self.plot()      def changelabel(arg):         main.lbl.settext(str(arg[0])+' '+str(arg[1]))      def plot(self):         # random data         data = [np.random.random() in range(10)]         # create axis         ax = self.figure.add_subplot(111)         # discards old graph         ax.hold(false)         # plot data         line, = ax.plot(data, 'o', picker=5)  # 5 points tolerance         self.canvas.draw()         self.canvas.mpl_connect('pick_event',  window.onpick)      def onpick(self):         thisline = self.artist         xdata = thisline.get_xdata()         ydata = thisline.get_ydata()         ind = self.ind          # show data         self.msg = (xdata[ind], ydata[ind])         print(self.msg) #        window.changelabel(self.msg)         main.lbl.settext(str(self.msg[0])+' '+str(self.msg[1]))   if __name__ == '__main__':     app = qtgui.qapplication(sys.argv)     main = window()     main.show()     sys.exit(app.exec_()) 

, change in settext function, since call directly variable (no self or window).

main.lbl.settext(str(self.msg[0])+' '+str(self.msg[1])) 

Comments