PyQt5 mit dynamischem matplotlib
Verfasst: Montag 24. Juni 2019, 06:28
Hallo zusammen,
ich möchte mit PyQt5 ein Fenster öffnen, welches Daten plotten und später Messungen durchführen soll. Nutze dafür matplotlib (code adaptiert von https://gist.github.com/pklaus/3e16982d952969eb8a9a):
Das verlinkte Beispiel klappt, jedoch stürzt python bei mir ab, sobald ich MyDynamicPlotCanvas aufrufe. Kann den Fehler nicht finden und bin für jeden Hinweis dankbar.
Grüße
Markus
ich möchte mit PyQt5 ein Fenster öffnen, welches Daten plotten und später Messungen durchführen soll. Nutze dafür matplotlib (code adaptiert von https://gist.github.com/pklaus/3e16982d952969eb8a9a):
Code: Alles auswählen
import sys
from PyQt5 import QtWidgets
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import numpy as np
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.initUI()
def initUI(self):
QMainWindow.__init__(self)
self.setMinimumSize(QSize(100, 100))
self.setWindowTitle("test")
self.centralWidget = QWidget(self)
self.setCentralWidget(self.centralWidget)
self.layoutUI()
def layoutUI(self):
measurebtn = QPushButton('Measure', self)
measurebtn.clicked.connect(self.showMeasurement)
def showMeasurement(self):
print('measure1')
d = QDialog()
print('measure2')
MyDynamicPlotCanvas(self, width=8, height=4, dpi=100)
print('measure3')
d.setWindowModality(Qt.ApplicationModal)
d.exec_()
class PlotCanvas(FigureCanvas):
def __init__(self, parent=None, width=5, height=4, dpi=100):
self.fig = Figure(figsize=(width, height), dpi=dpi)
self.canvas = FigureCanvas(self.fig)
self.ax1 = self.fig.add_subplot(211, facecolor=(0.94, 0.94, 0.94)) # Farbe Plotbereich
self.fig.set_facecolor((0.94, 0.94, 0.94)) #Rahmenfarbe
self.ax3 = self.fig.add_subplot(212, facecolor = (0.94, 0.94, 0.94))
self.ax3.set_xticks([])
self.ax3.set_yticks([])
FigureCanvas.__init__(self, self.fig)
self.setParent(parent)
FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
class MyDynamicPlotCanvas(PlotCanvas):
def __init__(self, *args, **kwargs):
PlotCanvas.__init__(self, *args, **kwargs)
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.update_figure)
self.timer.start(100)
def update_figure(self):
xmin = 0
xmax = 10
c = 100
l = np.array([random.random() for i in range(c)])
x = np.arange(xmin, xmax, 10/c)
y = np.sin(x) + l/10
y2 = y*8
self.ax1.cla()
self.ax1.set_title('Amplification factor ')
self.ax1.set_xlim(-10, 10)
self.ax1.set_ylim(-10, 10)
self.ax1.set_xlabel('Time (s)')
self.ax1.set_ylabel('Signal (V)')
self.ax1.grid(color='gray', alpha=0.5, linestyle='dashed', linewidth=0.5)
self.ax1.plot(x, y, 'y')
self.ax1.plot(x, y2, 'b')
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyle('Fusion')
w = MainWindow()
w.show()
app.exec_()
Grüße
Markus