J'essaie actuellement d'intégrer un graphique que je souhaite tracer dans une interface utilisateur pyqt4 que j'ai conçue. Comme je suis presque complètement nouveau en programmation - je ne comprends pas comment les gens ont intégré les exemples que j’ai trouvés - celui-ci (en bas) et celui-là .
Ce serait génial si quelqu'un pouvait publier une explication étape par étape ou au moins un très petit code très simple ne créant que par exemple. un graphique et un bouton dans une interface graphique pyqt4.
Ce n'est pas si compliqué que ça. Les widgets Qt pertinents sont dans matplotlib.backends.backend_qt4agg
. FigureCanvasQTAgg
et NavigationToolbar2QT
sont généralement ce dont vous avez besoin. Ce sont des widgets Qt réguliers. Vous les traitez comme n'importe quel autre widget. Ci-dessous, un exemple très simple avec un Figure
, Navigation
et un bouton unique qui dessine des données aléatoires. J'ai ajouté des commentaires pour expliquer les choses.
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_())
Éditer :
Mis à jour pour refléter les commentaires et les modifications de l'API.
NavigationToolbar2QTAgg
Modifié avec NavigationToolbar2QT
Figure
au lieu de pyplot
ax.hold(False)
par ax.clear()
Ci-dessous, une adaptation du code précédent pour l’utilisation sous PyQt5 et Matplotlib 2.. Il y a un certain nombre de petits changements: la structure des sous-modules PyQt, d'autres sous-modules de matplotlib, la méthode obsolète ont été remplacés ...
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_())