Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Intégration de MatPlotLib dans une application PySide2 (Qt)

Pour ceux d'entre vous qui font aussi du calcul scientifique en Python, sachez qu'il est possible d'intégrer l'outil MatPlotLib, un outil de tracer de graphes, dans une application PySide2/Qt. Je vous propose un exemple relativement simple qui permet de tracer une courbe (Sinus ou Cosinus) dans MatPlotLib. Le choix de la courbe s'effectue en cliquant sur l'un des deux boutons Qt en haut de la fenêtre.

Notez que l'application permet aussi de rajouter des marqueurs sur le graphe en cliquant à la position souhaitée. Cela me permet de vous montrer comment intercepter les événements intervenant sur MatPlotLib et de les traiter.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 
 41 
 42 
 43 
 44 
 45 
 46 
 47 
 48 
 49 
 50 
 51 
 52 
 53 
 54 
 55 
 56 
 57 
 58 
 59 
 60 
 61 
 62 
 63 
 64 
 65 
 66 
 67 
 68 
 69 
 70 
 71 
 72 
 73 
 74 
 75 
 76 
import sys

import numpy as np

from PySide2.QtGui import *
from PySide2.QtWidgets import *

from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvas


class MyWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.setWindowTitle("Curve Tracer V1.0")

        # On défini le widget central avec un layout de type QVBoxLayout 
        mainWidget = QWidget()
        self.setCentralWidget(mainWidget)
        vbox = QVBoxLayout(mainWidget)
        
        # On y ajoute deux boutons dans un layout QHBoxLayout
        self.__btnSinus = QPushButton("Sinus")
        self.__btnSinus.clicked.connect(self.btnSinusClicked)
        self.__btnCosinus = QPushButton("Cosinus")
        self.__btnCosinus.clicked.connect(self.btnCosinusClicked)

        hbox = QHBoxLayout()
        hbox.addWidget( self.__btnSinus)
        hbox.addWidget( self.__btnCosinus)
        vbox.addLayout(hbox)

        # On ajoute le canvas MatPlotLib en dessous de la barre de boutons
        self.__canvas = FigureCanvas(Figure(figsize=(4, 3)))        
        vbox.addWidget(self.__canvas)
        self.__plt = self.__canvas.figure.subplots()

        # On conecte un gestionnaire d'événements (un slot) au clic sur le canvas.
        # mpl_connect == MatPlotLib_connect  ;-)
        self.__canvas.mpl_connect("button_press_event", self.canvasClicked)

        # On force le tracé de la courbe Sinus à l'ouverture de la fenêtre
        self.btnSinusClicked()

    # Un slot pour réagir au clic sur le canvas MatPlotLib
    def canvasClicked(self, event):
        self.__plt.scatter(event.xdata, event.ydata, marker="+", s=100)
        self.__canvas.draw()
        print(dir(event))

    # Un slot pour réagir au clic sur le bouton btnSinus
    def btnSinusClicked(self):
        self.__plt.clear()
        x = np.linspace(-10, 10, 1000)
        y = np.sin(x)
        self.__plt.plot(x, y, "r")
        self.__canvas.draw()

    # Un slot pour réagir au clic sur le bont btnCosinus
    def btnCosinusClicked(self):
        self.__plt.clear()
        x = np.linspace(-10, 10, 1000)
        y = np.cos(x)
        self.__plt.plot(x, y, "b--")
        self.__canvas.draw()


# Démarrage de la fenêtre
if __name__ == "__main__":
    app = QApplication(sys.argv)

    myWindow = MyWindow()
    myWindow.show()

    sys.exit(app.exec_())
Intégration de MatPlotLib dans une application PySide2 (Qt)
certains IDE (PyCharm et PyDev notamment) affiche une erreur sur l'import en ligne 9. Il en est rien : procédez au lancement de l'application et vous devriez voir la fenêtre apparaître.

Et voici le résultat produit par cet exemple (pensez à cliquer sur le graphe pour ajouter les croix).

Intégration de MatPlotLib dans une application PySide2 (Qt)