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 de graphes MatPlotLib en 3D

Ce nouvel exemple vous montre comment intégrer deux graphes MatPlotLib en 3D dans une application Qt/PySide6.

les graphiques sont dynamiques et vous pouvez les controller à la souris. En maintenant le bouton gauche de la souris appuyé et en bougeant la souris, vous pouvez tourner autour du graphe. En maintenant le bouton droit de la souris appuyé et en bougeant la souris, vous pouvez zoomer sur le modèle de données affiché. En maintenant la molette de la souris appuyé et en bougeant la souris, vous pouvez effectuer des translations du graphe.
 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 
import sys

from PySide6.QtWidgets import *

from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvas, NavigationToolbar2QT as NavigationToolbar
import numpy as np


def fct(x, y):
    return np.sin(x) + np.cos(x + y)


class MyWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.setWindowTitle("3D Graph integrations")

        mainWidget = QWidget()
        self.setCentralWidget(mainWidget)
        vbox = QVBoxLayout(mainWidget)

        self.__btnScatter = QPushButton("3D Scatter")
        self.__btnScatter.clicked.connect(self.btnScatterClicked)
        self.__btnSurface = QPushButton("3D Surface")
        self.__btnSurface.clicked.connect(self.btnSurfaceClicked)

        hbox = QHBoxLayout()
        hbox.addWidget(self.__btnScatter)
        hbox.addWidget(self.__btnSurface)
        vbox.addLayout(hbox)

        self.__canvas = FigureCanvas(Figure(figsize=(4, 3)))
        vbox.addWidget(self.__canvas)
        self.__plt = self.__canvas.figure.add_subplot(projection='3d')

        toolbar = NavigationToolbar(self.__canvas, self)
        vbox.addWidget(toolbar)

        self.btnScatterClicked()

    def btnScatterClicked(self):
        self.__plt.clear()
        self.__plt.scatter(np.random.randn(100), np.random.randn(100), np.random.randn(100))
        self.__canvas.draw()

    def btnSurfaceClicked(self):
        self.__plt.clear()
        x = np.linspace(0, 5, 100)
        y = np.linspace(0, 5, 100)
        x, y = np.meshgrid(x, y)
        z = fct(x, y)
        self.__plt.plot_surface(x, y, z, cmap="coolwarm")
        self.__canvas.draw()


if __name__ == "__main__":
    app = QApplication(sys.argv)

    myWindow = MyWindow()
    myWindow.show()

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

Et voici les différents affichages produits.

Intégration de scatter 3D MatPlotLib dans une application Qt/PySide6
Intégration d'une surface 3D MatPlotLib dans une application Qt/PySide6