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
Post a Comment