it-swarm.com.de

Matplotlib in pyqt einbetten - für Dummies

Ich versuche gerade, ein Diagramm, das ich zeichnen möchte, in eine von mir entworfene pyqt4-Benutzeroberfläche einzubetten. Da ich in der Programmierung fast völlig neu bin, verstehe ich nicht, wie die Leute die Einbettung in die von mir gefundenen Beispiele vorgenommen haben - diese (unten) und diese .

Es wäre fantastisch, wenn jemand eine schrittweise Erklärung oder zumindest einen sehr kleinen, sehr einfachen Code posten könnte, der nur z. ein Diagramm und eine Schaltfläche in einer pyqt4-GUI.

69
ari

Es ist eigentlich nicht so kompliziert. Relevante Qt-Widgets befinden sich in matplotlib.backends.backend_qt4agg . FigureCanvasQTAgg und NavigationToolbar2QT sind normalerweise das, was Sie brauchen. Dies sind normale Qt-Widgets. Sie behandeln sie wie jedes andere Widget. Unten ist ein sehr einfaches Beispiel mit einem Figure, Navigation und einer einzelnen Schaltfläche, die einige zufällige Daten zeichnet. Ich habe Kommentare hinzugefügt, um die Dinge zu erklären.

import sys
from PyQt4 import QtGui

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure

import random

class Window(QtGui.QDialog):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        # a figure instance to plot on
        self.figure = Figure()

        # this is the Canvas Widget that displays the `figure`
        # it takes the `figure` instance as a parameter to __init__
        self.canvas = FigureCanvas(self.figure)

        # this is the Navigation widget
        # it takes the Canvas widget and a parent
        self.toolbar = NavigationToolbar(self.canvas, self)

        # Just some button connected to `plot` method
        self.button = QtGui.QPushButton('Plot')
        self.button.clicked.connect(self.plot)

        # set the layout
        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.toolbar)
        layout.addWidget(self.canvas)
        layout.addWidget(self.button)
        self.setLayout(layout)

    def plot(self):
        ''' plot some random stuff '''
        # random data
        data = [random.random() for i in range(10)]

        # create an axis
        ax = self.figure.add_subplot(111)

        # discards the old graph
        ax.clear()

        # plot data
        ax.plot(data, '*-')

        # refresh canvas
        self.canvas.draw()

if __== '__main__':
    app = QtGui.QApplication(sys.argv)

    main = Window()
    main.show()

    sys.exit(app.exec_())

Bearbeiten :

Aktualisiert, um Kommentare und API-Änderungen widerzuspiegeln.

  • NavigationToolbar2QTAgg Geändert mit NavigationToolbar2QT
  • Direkter Import von Figure anstelle von pyplot
  • Ersetzen Sie veraltetes ax.hold(False) durch ax.clear()
101
Avaris

Unten finden Sie eine Anpassung des vorherigen Codes für die Verwendung unter PyQt5 und Matplotlib 2.. Es gibt eine Reihe kleiner Änderungen: Struktur von PyQt-Submodulen, anderes Submodul aus Matplotlib, veraltete Methode wurde ersetzt ...


import sys
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
import matplotlib.pyplot as plt

import random

class Window(QDialog):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        # a figure instance to plot on
        self.figure = plt.figure()

        # this is the Canvas Widget that displays the `figure`
        # it takes the `figure` instance as a parameter to __init__
        self.canvas = FigureCanvas(self.figure)

        # this is the Navigation widget
        # it takes the Canvas widget and a parent
        self.toolbar = NavigationToolbar(self.canvas, self)

        # Just some button connected to `plot` method
        self.button = QPushButton('Plot')
        self.button.clicked.connect(self.plot)

        # set the layout
        layout = QVBoxLayout()
        layout.addWidget(self.toolbar)
        layout.addWidget(self.canvas)
        layout.addWidget(self.button)
        self.setLayout(layout)

    def plot(self):
        ''' plot some random stuff '''
        # random data
        data = [random.random() for i in range(10)]

        # instead of ax.hold(False)
        self.figure.clear()

        # create an axis
        ax = self.figure.add_subplot(111)

        # discards the old graph
        # ax.hold(False) # deprecated, see above

        # plot data
        ax.plot(data, '*-')

        # refresh canvas
        self.canvas.draw()

if __== '__main__':
    app = QApplication(sys.argv)

    main = Window()
    main.show()

    sys.exit(app.exec_())
55
Anabar