web-dev-qa-db-fra.com

Comment intégrer matplotlib dans pyqt - pour les nuls

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.

69
ari

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
  • Importer directement Figure au lieu de pyplot
  • Remplacez obsolète ax.hold(False) par ax.clear()
101
Avaris

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_())
55
Anabar