Es ist eigentlich nicht so kompliziert. Relevante Qt-Widgets sind in matplotlib.backends.backend_qt4agg
. FigureCanvasQTAgg
und NavigationToolbar2QT
sind in der Regel das, was Sie brauchen. Dies sind reguläre Qt-Widgets. Sie behandeln sie wie jedes andere Widget. Unten ist ein sehr einfaches Beispiel mit einem Figure
, Navigation
und eine einzelne Taste , die einige Zufallsdaten zieht. 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)
self.figure = Figure()
self.canvas = FigureCanvas(self.figure)
self.toolbar = NavigationToolbar(self.canvas, self)
self.button = QtGui.QPushButton('Plot')
self.button.clicked.connect(self.plot)
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 '''
data = [random.random() for i in range(10)]
ax = self.figure.add_subplot(111)
ax.clear()
ax.plot(data, '*-')
self.canvas.draw()
if __name__ == '__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
- Direkt importieren
Figure
stattpyplot
- Ersetzen Sie veraltet
ax.hold(False)
durchax.clear()
NavigationToolbar2QT
. Bitte ändern Sie Ihren Code, umNavigationToolbar2QT
stattdessen mplDeprecation zu verwenden)NavigationToolbar2QTAgg
durch BeendenNavigationToolbar2QT
der NachrichtNavigationToolbar2QTAgg
zuNavigationToolbar2QT
). Ich fand, dass eine Lösung IPythonQVBoxLayout
in ein Hauptfenster zu setzen. Gibt es eine Möglichkeit, die Leinwand und die Figur dazu zu bringen, ein hohes Rechteck zu füllen (ungefähr 1,5-mal so hoch wie breit)?Unten finden Sie eine Anpassung des vorherigen Codes für die Verwendung unter PyQt5 und Matplotlib 2.0 . Es gibt eine Reihe kleiner Änderungen: Struktur der PyQt-Submodule, andere Submodule von 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 __name__ == '__main__': app = QApplication(sys.argv) main = Window() main.show() sys.exit(app.exec_())
quelle
ax.hold
die Veralterung angeben? Warum nicht auchax.clear
die Axes-Instanz wiederverwenden?matplotlib.pyplot
empfehlenswert, beim Einbetten von matplotlib in pyqt zu importieren (bitte korrigieren Sie mich, wenn ich in dieser Situation falsch liege). Wenn ich richtig bin, habe ich meine Matplotlib mit dieser Methode in diesen SO-Beitrag eingebettet, der kein Pyplot importiert: stackoverflow.com/questions/43947318/…Für diejenigen, die nach einer dynamischen Lösung suchen, um Matplotlib in PyQt5 einzubetten (sogar Daten per Drag & Drop zeichnen). In PyQt5 müssen Sie Super für die Hauptfensterklasse verwenden, um die Drops zu akzeptieren. Die dropevent-Funktion kann verwendet werden, um den Dateinamen abzurufen, und der Rest ist einfach:
def dropEvent(self,e): """ This function will enable the drop file directly on to the main window. The file location will be stored in the self.filename """ if e.mimeData().hasUrls: e.setDropAction(QtCore.Qt.CopyAction) e.accept() for url in e.mimeData().urls(): if op_sys == 'Darwin': fname = str(NSURL.URLWithString_(str(url.toString())).filePathURL().path()) else: fname = str(url.toLocalFile()) self.filename = fname print("GOT ADDRESS:",self.filename) self.readData() else: e.ignore() # just like above functions
Für den Anfang der Referenz vollständige Code gibt die folgende Ausgabe:
quelle