importsysimporttimeimportnumpyasnpfrommatplotlib.backends.backend_qtaggimportFigureCanvasfrommatplotlib.backends.backend_qtaggimport \
NavigationToolbar2QTasNavigationToolbarfrommatplotlib.backends.qt_compatimportQtWidgetsfrommatplotlib.figureimportFigureclassApplicationWindow(QtWidgets.QMainWindow):def__init__(self):super().__init__()self._main=QtWidgets.QWidget()self.setCentralWidget(self._main)layout=QtWidgets.QVBoxLayout(self._main)static_canvas=FigureCanvas(Figure(figsize=(5,3)))layout.addWidget(static_canvas)dynamic_canvas=FigureCanvas(Figure(figsize=(5,3)))layout.addWidget(dynamic_canvas)# layout.addWidget(NavigationToolbar(dynamic_canvas, self))self._static_ax=static_canvas.figure.subplots()t=np.linspace(0,10,501)self._static_ax.plot(t,np.tan(t),".")self._static_ax.set_title("Static plot")self._dynamic_ax=dynamic_canvas.figure.subplots()self._dynamic_ax.set_title("Dynamic plot")# Set up a Line2D.self.xdata=np.linspace(0,10,101)self._update_ydata()self._line,=self._dynamic_ax.plot(self.xdata,self.ydata)# The below two timers must be attributes of self, so that the garbage# collector won't clean them after we finish with __init__...# The data retrieval may be fast as possible (Using QRunnable could be# even faster).self.data_timer=dynamic_canvas.new_timer(1)self.data_timer.add_callback(self._update_ydata)self.data_timer.start()# Drawing at 50Hz should be fast enough for the GUI to feel smooth, and# not too fast for the GUI to be overloaded with events that need to be# processed while the GUI element is changed.self.drawing_timer=dynamic_canvas.new_timer(20)self.drawing_timer.add_callback(self._update_canvas)self.drawing_timer.start()def_update_ydata(self):# update the data onlyself.ydata=np.sin(self.xdata+time.time())def_update_canvas(self):# update matplotlib canvasself._line.set_data(self.xdata,self.ydata)self._line.figure.canvas.draw_idle()if__name__=="__main__":# Check whether there is already a running QApplication (e.g., if running# from an IDE).qapp=QtWidgets.QApplication.instance()ifnotqapp:qapp=QtWidgets.QApplication(sys.argv)app=ApplicationWindow()app.show()app.activateWindow()app.raise_()qapp.exec()