Repaint Basmap-Plot in Qt5

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
superschlau
User
Beiträge: 26
Registriert: Mittwoch 4. April 2018, 09:12

Ich komme mal nicht weiter.
Eine kurze Erklärung. Ich möchte in einem Qt5-Fenster basemap-Grafik ausgeben. Dies funktioniert mit nachfolgendem Code.
Jetzt möchte ich die Grafik repainten. dazu habe ich im Modell zwei Ausgaben der Weltkarte programmiert, welche mittels den Buttons eingeblendet werden sollen.
Ich kann jede Grafik einmal aufrufen. Möchte ich diese überschreiben, so passiert nichts im Qt5-Fenster. Im Jupiter-Notebook angewendet sehe ich aber die richtige Ausgabe der Grafik.
Meine Frage, wie kann ich die Angaben im FigureCanvas (oder sonst wo) löschen, damit die neue Grafik angezeigt wird?
Danke für eure Hinweise...

Code: Alles auswählen

import sys
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from mpl_toolkits.basemap import Basemap
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class BasemapCanvas(FigureCanvas):
    def __init__(self, *args, **kwargs):
        self.figure = plt.figure()
        FigureCanvas.__init__(self, self.figure)
        self.figure.patch.set_facecolor("None")
        self.figure.subplots_adjust(left=0.019, bottom=0.035, right=0.99, top=0.964)

        
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # Basemap einrichten
        self.graph = BasemapCanvas()
        vbox = QVBoxLayout()
        vbox.addWidget(self.graph)
        self.ui.frame.setLayout(vbox)
        
        self.ui.pushButton_1.clicked.connect(self.plot_point1)
        self.ui.pushButton_2.clicked.connect(self.plot_point2)
        self.show()
        
        
    def plot_point1(self):
        self.graph.figure.clf()
        self.axes = self.graph.figure.add_subplot(111)
        self.x = [0, 10, 20, 30]
        self.y = [0, 10, 20, 30]
        self.map = Basemap(resolution = 'l')
        self.map.drawmapboundary(fill_color='#00BFFF',zorder=1)
        self.map.fillcontinents(color='#F5D0A9',zorder=2,lake_color='aqua')
        self.axes.scatter(self.y,self.x, color='#FF0080', s=75, marker="*", zorder=4)
        plt.show()
        
    def plot_point2(self):
        self.graph.figure.clf()
        self.axes = self.graph.figure.add_subplot(111)
            
        # set up orthographic map projection with
        # perspective of satellite looking down at 50N, 100W.
        # use low resolution coastlines.
        m = Basemap(projection='ortho', lat_0=47.1, lon_0=8.3, resolution='l')
        # draw coastlines, country boundaries, fill continents.
        m.drawcoastlines(linewidth=0.25)
        m.drawcountries(linewidth=0.25)
        m.fillcontinents(color='coral', lake_color='aqua')
        # draw the edge of the map projection region (the projection limb)
        m.drawmapboundary(fill_color='aqua')
        # draw lat/lon grid lines every 30 degrees.
        m.drawmeridians(np.arange(0, 360, 30))
        m.drawparallels(np.arange(-90, 90, 30))
        plt.show()
        
if __name__ == "__main__":
    # Erzeugen eines Applikations-Objektes
    app = QApplication(sys.argv)
    # Erzeugen eines Fensters
    win = MainWindow()
    # Darstellung des Fensters
    win.show()

    # Ordnungsgemässe Beenung der Anwendung
    sys.exit(app.exec_())
#### END of Main #######       
Mit der MainWindow-Definitione aus dem QtDesigner:

Code: Alles auswählen

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1460, 1112)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setObjectName("groupBox")
        self.layoutWidget = QtWidgets.QWidget(self.groupBox)
        self.layoutWidget.setGeometry(QtCore.QRect(19, 44, 1386, 115))
        self.layoutWidget.setObjectName("layoutWidget")
        self.gridLayout_9 = QtWidgets.QGridLayout(self.layoutWidget)
        self.gridLayout_9.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_9.setObjectName("gridLayout_9")
        self.pushButton_1 = QtWidgets.QPushButton(self.layoutWidget)
        self.pushButton_1.setObjectName("pushButton_1")
        self.gridLayout_9.addWidget(self.pushButton_1, 0, 1, 1, 1)
        self.pushButton_2 = QtWidgets.QPushButton(self.layoutWidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout_9.addWidget(self.pushButton_2, 0, 3, 1, 1)
        self.label_37 = QtWidgets.QLabel(self.layoutWidget)
        self.label_37.setObjectName("label_37")
        self.gridLayout_9.addWidget(self.label_37, 0, 0, 1, 1)
        self.label_38 = QtWidgets.QLabel(self.layoutWidget)
        self.label_38.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.label_38.setObjectName("label_38")
        self.gridLayout_9.addWidget(self.label_38, 0, 2, 1, 1)
        self.label = QtWidgets.QLabel(self.layoutWidget)
        self.label.setText("")
        self.label.setObjectName("label")
        self.gridLayout_9.addWidget(self.label, 0, 4, 1, 1)
        self.gridLayout_9.setColumnStretch(4, 100)
        self.horizontalLayoutWidget = QtWidgets.QWidget(self.groupBox)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(19, 171, 1386, 811))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayoutVerlauf = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayoutVerlauf.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize)
        self.horizontalLayoutVerlauf.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayoutVerlauf.setSpacing(12)
        self.horizontalLayoutVerlauf.setObjectName("horizontalLayoutVerlauf")
        self.frame = QtWidgets.QFrame(self.horizontalLayoutWidget)
        self.frame.setMinimumSize(QtCore.QSize(1429, 809))
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.horizontalLayoutVerlauf.addWidget(self.frame)
        self.verticalLayout.addWidget(self.groupBox)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1460, 38))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.groupBox.setTitle(_translate("MainWindow", "GroupBox"))
        self.pushButton_1.setText(_translate("MainWindow", "Grafik 1"))
        self.pushButton_2.setText(_translate("MainWindow", "Grafik2"))
        self.label_37.setText(_translate("MainWindow", "Karte 1"))
        self.label_38.setText(_translate("MainWindow", "Karte 2"))

superschlau
User
Beiträge: 26
Registriert: Mittwoch 4. April 2018, 09:12

Mit etwas "runtüfteln" habe ich es nun zum Laufen gebracht. Nachvollziehen kann ich es nicht, da müsste ich mich mal eingehender mit der Struktur dieses matplotlib beschäftigen.

Mein Code sieht nun wie folgt aus:

Code: Alles auswählen

import sys
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from mpl_toolkits.basemap import Basemap
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class BasemapCanvas(FigureCanvas):
    def __init__(self, *args, **kwargs):
        self.figure = plt.figure()
        FigureCanvas.__init__(self, self.figure)
        self.figure.patch.set_facecolor("None")
        self.figure.subplots_adjust(left=0.019, bottom=0.035, right=0.99, top=0.964)

        
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # Basemap einrichten
        self.graph = BasemapCanvas()
        vbox = QVBoxLayout()
        vbox.addWidget(self.graph)
        self.ui.frame.setLayout(vbox)
        
        self.ui.pushButton_1.clicked.connect(self.plot_point1)
        self.ui.pushButton_2.clicked.connect(self.plot_point2)
        self.show()
        
        
    def plot_point1(self):
        self.axes = self.graph.figure.add_axes([0, 0, 1, 1], frameon=False)
        self.x = [0, 10, 20, 30]
        self.y = [0, 10, 20, 30]
        self.map = Basemap(resolution = 'l',  ax=self.axes)
        self.map.drawmapboundary(fill_color='#00BFFF',zorder=1)
        self.map.fillcontinents(color='#F5D0A9',zorder=2,lake_color='aqua')
        self.axes.scatter(self.y,self.x, color='#FF0080', s=75, marker="*", zorder=4)
        self.graph.draw()
        
    def plot_point2(self):
        self.axes = self.graph.figure.add_axes([0, 0, 1, 1], frameon=False)
            
        # set up orthographic map projection with
        # perspective of satellite looking down at 50N, 100W.
        # use low resolution coastlines.
        m = Basemap(projection='ortho', lat_0=47.1, lon_0=8.3, resolution='l',  ax=self.axes)
        # draw coastlines, country boundaries, fill continents.
        m.drawcoastlines(linewidth=0.25)
        m.drawcountries(linewidth=0.25)
        m.fillcontinents(color='coral', lake_color='aqua')
        # draw the edge of the map projection region (the projection limb)
        m.drawmapboundary(fill_color='aqua')
        # draw lat/lon grid lines every 30 degrees.
        m.drawmeridians(np.arange(0, 360, 30))
        m.drawparallels(np.arange(-90, 90, 30))
        self.graph.draw()
        
if __name__ == "__main__":
    # Erzeugen eines Applikations-Objektes
    app = QApplication(sys.argv)
    # Erzeugen eines Fensters
    win = MainWindow()
    # Darstellung des Fensters
    win.show()

    # Ordnungsgemässe Beenung der Anwendung
    sys.exit(app.exec_())
#### END of Main #######    
Antworten