Participer au site avec un Tip
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 d'une courbe MatPlotLib

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 PySide6/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 
import sys

import numpy as np

from PySide6.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QPushButton, QHBoxLayout, QApplication

from matplotlib.figure import Figure
from matplotlib.backends.backend_qtagg 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 connecte 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()

    # 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 Qt/PySide6
certains IDE (PyCharm et PyDev notamment) affiche une erreur sur l'import en ligne 8. 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 Qt/PySide6