Matplotlib Plot in Layout skalieren

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
QTim
User
Beiträge: 7
Registriert: Mittwoch 27. September 2017, 08:58

Matplotlib Plot in Layout skalieren

Beitragvon QTim » Montag 16. Oktober 2017, 10:28

Hallo,

ich habe eine GUI erstellt, welche Live-Daten plotten soll und so sieht sie aus:

Bild

Das plotten an sich funktioniert, nur leider habe ich einige Schwierigkeiten mit der Darstellung. Ich bekomme es nicht hin, dass der Plot richtig in das Layout skaliert wird, in welches er hinzugefügt wird.
Figure(figsize = (w,h))
und
plt.tight_layout()
habe ich schon probiert, allerdings ohne Erfolg..

Hier ist der Code welcher von
pyuic5
aus der GUI generiert wurde:
  1. from PyQt5 import QtCore, QtGui, QtWidgets
  2.  
  3. class Ui_GTM_Form(object):
  4.     def setupUi(self, GTM_Form):
  5.         GTM_Form.setObjectName("GTM_Form")
  6.         GTM_Form.resize(869, 662)
  7.         GTM_Form.setAutoFillBackground(False)
  8.         GTM_Form.setStyleSheet("background-color: rgb(62,62,62)")
  9.         self.horizontalLayout_2 = QtWidgets.QHBoxLayout(GTM_Form)
  10.         self.horizontalLayout_2.setObjectName("horizontalLayout_2")
  11.         self.horizontalLayout = QtWidgets.QHBoxLayout()
  12.         self.horizontalLayout.setObjectName("horizontalLayout")
  13.         self.tabWidget = QtWidgets.QTabWidget(GTM_Form)
  14.         font = QtGui.QFont()
  15.         font.setPointSize(20)
  16.         font.setKerning(True)
  17.         self.tabWidget.setFont(font)
  18.         self.tabWidget.setLayoutDirection(QtCore.Qt.LeftToRight)
  19.         self.tabWidget.setStyleSheet("color: white;")
  20.         self.tabWidget.setLocale(QtCore.QLocale(QtCore.QLocale.German, QtCore.QLocale.Germany))
  21.         self.tabWidget.setObjectName("tabWidget")
  22.         self.tabAusrichtung = QtWidgets.QWidget()
  23.         self.tabAusrichtung.setObjectName("tabAusrichtung")
  24.         self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.tabAusrichtung)
  25.         self.horizontalLayout_4.setObjectName("horizontalLayout_4")
  26.         self.horizontalLayoutTabAusrichtung = QtWidgets.QHBoxLayout()
  27.         self.horizontalLayoutTabAusrichtung.setObjectName("horizontalLayoutTabAusrichtung")
  28.         self.PicLabel = QtWidgets.QLabel(self.tabAusrichtung)
  29.         self.PicLabel.setText("")
  30.         self.PicLabel.setObjectName("PicLabel")
  31.         self.horizontalLayoutTabAusrichtung.addWidget(self.PicLabel)
  32.         self.horizontalLayout_4.addLayout(self.horizontalLayoutTabAusrichtung)
  33.         self.tabWidget.addTab(self.tabAusrichtung, "")
  34.         self.tabPlot1 = QtWidgets.QWidget()
  35.         self.tabPlot1.setObjectName("tabPlot1")
  36.         self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.tabPlot1)
  37.         self.horizontalLayout_5.setObjectName("horizontalLayout_5")
  38.         self.horizontalLayoutTabPlot1 = QtWidgets.QHBoxLayout()
  39.         self.horizontalLayoutTabPlot1.setObjectName("horizontalLayoutTabPlot1")
  40.         self.horizontalLayout_5.addLayout(self.horizontalLayoutTabPlot1)
  41.         self.tabWidget.addTab(self.tabPlot1, "")
  42.         self.tab = QtWidgets.QWidget()
  43.         self.tab.setObjectName("tab")
  44.         self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.tab)
  45.         self.verticalLayout_2.setObjectName("verticalLayout_2")
  46.         self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
  47.         self.horizontalLayout_3.setObjectName("horizontalLayout_3")
  48.         self.TestLabel = QtWidgets.QLabel(self.tab)
  49.         self.TestLabel.setText("")
  50.         self.TestLabel.setObjectName("TestLabel")
  51.         self.horizontalLayout_3.addWidget(self.TestLabel)
  52.         self.verticalLayout_2.addLayout(self.horizontalLayout_3)
  53.         self.tabWidget.addTab(self.tab, "")
  54.         self.horizontalLayout.addWidget(self.tabWidget)
  55.         self.horizontalLayout_2.addLayout(self.horizontalLayout)
  56.         self.verticalLayout = QtWidgets.QVBoxLayout()
  57.         self.verticalLayout.setObjectName("verticalLayout")
  58.         self.BtnStart = QtWidgets.QPushButton(GTM_Form)
  59.         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
  60.         sizePolicy.setHorizontalStretch(0)
  61.         sizePolicy.setVerticalStretch(0)
  62.         sizePolicy.setHeightForWidth(self.BtnStart.sizePolicy().hasHeightForWidth())
  63.         self.BtnStart.setSizePolicy(sizePolicy)
  64.         font = QtGui.QFont()
  65.         font.setPointSize(20)
  66.         self.BtnStart.setFont(font)
  67.         self.BtnStart.setStyleSheet("background-color: rgb(50,50,50);\n"
  68. "color: white;")
  69.         self.BtnStart.setObjectName("BtnStart")
  70.         self.verticalLayout.addWidget(self.BtnStart)
  71.         self.BtnEnd = QtWidgets.QPushButton(GTM_Form)
  72.         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
  73.         sizePolicy.setHorizontalStretch(0)
  74.         sizePolicy.setVerticalStretch(0)
  75.         sizePolicy.setHeightForWidth(self.BtnEnd.sizePolicy().hasHeightForWidth())
  76.         self.BtnEnd.setSizePolicy(sizePolicy)
  77.         font = QtGui.QFont()
  78.         font.setPointSize(20)
  79.         self.BtnEnd.setFont(font)
  80.         self.BtnEnd.setStyleSheet("background-color: rgb(50,50,50);\n"
  81. "color: white;")
  82.         self.BtnEnd.setObjectName("BtnEnd")
  83.         self.verticalLayout.addWidget(self.BtnEnd)
  84.         self.BtnShutdown = QtWidgets.QPushButton(GTM_Form)
  85.         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
  86.         sizePolicy.setHorizontalStretch(0)
  87.         sizePolicy.setVerticalStretch(0)
  88.         sizePolicy.setHeightForWidth(self.BtnShutdown.sizePolicy().hasHeightForWidth())
  89.         self.BtnShutdown.setSizePolicy(sizePolicy)
  90.         font = QtGui.QFont()
  91.         font.setPointSize(20)
  92.         self.BtnShutdown.setFont(font)
  93.         self.BtnShutdown.setStyleSheet("background-color: rgb(50,50,50);\n"
  94. "color: white;")
  95.         self.BtnShutdown.setObjectName("BtnShutdown")
  96.         self.verticalLayout.addWidget(self.BtnShutdown)
  97.         self.horizontalLayout_2.addLayout(self.verticalLayout)
  98.  
  99.         self.retranslateUi(GTM_Form)
  100.         self.tabWidget.setCurrentIndex(1)
  101.         QtCore.QMetaObject.connectSlotsByName(GTM_Form)
  102.  
  103.     def retranslateUi(self, GTM_Form):
  104.         _translate = QtCore.QCoreApplication.translate
  105.         GTM_Form.setWindowTitle(_translate("GTM_Form", "GTM"))
  106.         self.tabWidget.setTabText(self.tabWidget.indexOf(self.tabAusrichtung), _translate("GTM_Form", "Ausrichtung"))
  107.         self.tabWidget.setTabText(self.tabWidget.indexOf(self.tabTransmission), _translate("GTM_Form", "Transmission"))
  108.         self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("GTM_Form", "Page"))
  109.         self.BtnStart.setText(_translate("GTM_Form", "Start"))
  110.         self.BtnEnd.setText(_translate("GTM_Form", "End"))
  111.         self.BtnShutdown.setText(_translate("GTM_Form", "Shutdown"))
  112.  
  113.  
  114. if __name__ == "__main__":
  115.     import sys
  116.     app = QtWidgets.QApplication(sys.argv)
  117.     GTM_Form = QtWidgets.QWidget()
  118.     ui = Ui_GTM_Form()
  119.     ui.setupUi(GTM_Form)
  120.     GTM_Form.show()
  121.     sys.exit(app.exec_())


und hier der Code wie geplottet wird:

  1. import matplotlib.pyplot as plt
  2. from PyQt5 import QtGui, QtWidgets, QtCore, uic
  3. from PyQt5.QtGui import QIcon, QPixmap
  4.  
  5. from PyQt5.QtWidgets import *
  6.  
  7. from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
  8. from matplotlib.figure import Figure
  9.  
  10. class myUi(QtWidgets.QWidget):
  11.     def __init__(self):
  12.         super(myUi, self).__init__()
  13.         uic.loadUi("test3.ui", self)
  14.         self.show()#Maximized()
  15.         self.Btn()
  16.  
  17.     def Btn(self):
  18.         self.BtnStart.clicked.connect(self.StartGTM)
  19.         self.BtnEnd.clicked.connect(self.EndGTM)
  20.         self.BtnShutdown.clicked.connect(self.ShutdownGTM)
  21.  
  22.     def StartGTM(self):
  23.         print("start")
  24.         ui.setupPlot()
  25.  
  26.  
  27.     def EndGTM(self):
  28.         print("end")
  29.  
  30.     def ShutdownGTM(self):
  31.         print("shutdown")
  32.         exit()
  33.  
  34.     def setupPlot(self):
  35.         self.fig = plt.figure()
  36.         while (1):
  37.                 self.fig.clear()
  38.                 plt.ylim(0,110)
  39.                 bar_width = 50
  40.                 plt.xticks(xticks)
  41.                 plt.bar(xticks, transm_values, bar_width, color="#CC0000")
  42.                 plt.xlabel('Daten')
  43.                 plt.ylabel('Prozent')
  44.                 self.canvas = FigureCanvas(self.fig)
  45.                 self.widget = QtWidgets.QWidget()
  46.                 clearLayout(self.horizontalLayoutTabTransmission)
  47.                 self.horizontalLayoutTabTransmission.addWidget(self.canvas)
  48.                 self.horizontalLayoutTabTransmission.addWidget(self.widget)
  49.                 plt.draw()
  50.  
  51. def clearLayout(layout):
  52.     while layout.count():
  53.         child = layout.takeAt(0)
  54.         if child.widget() is not None:
  55.             child.widget().deleteLater()
  56.         elif child.layout() is not None:
  57.             clearLayout(child.layout())


Ist das möglich? Ich würde mir gerne aus der Gui eine Fullscreen-App machen und wenn ich das Fenster vergrößere, sieht es einfach schlecht aus.

Danke schon mal im Voraus!
Benutzeravatar
Sr4l
User
Beiträge: 1083
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Re: Matplotlib Plot in Layout skalieren

Beitragvon Sr4l » Montag 23. Oktober 2017, 11:00

Ich habe mir deinen Code nicht näher angeschaut. Ich mache das Layout immer in qt Designer Dateien und lade diese dann im Python Code das hält den Code übersichtlich.

Ich habe etwas ähnliches wie du gemacht (pyqt5, python2 und 3) und habe mich dabei an MyDynamicMPLCanvas() orientiert was hier zu finden ist: https://matplotlib.org/examples/user_in ... n_qt5.html

Wichtig ist die saubere Trennung der Funktionen update_figure(), welches die Daten aktualisiert und compute_initial_figure(). Wenn die GUI verändert wird führst du compute_initial_figure() einfach wieder aus und dein matplotlib plot passt sich an seinen Container an.

mfG

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder