Matplotlib est une bibliothèque de visualisation de données très polyvalente pour Python, qui prend en charge un large éventail de types de graphiques, y compris les graphiques 3D. Il fournit donc des classes et des fonctions pour tracer facilement des graphiques 3D à partir de données en trois dimensions.
Voici quelques types de graphiques 3D que vous pouvez créer avec MatPlotLib :
Lignes 3D (line plot) : Utilisez la fonction plot pour tracer des lignes entre des points dans un espace tridimensionnel.
Nuages de points 3D (scatter plot) : Utilisez la fonction scatter pour créer un nuage de points en 3D, où chaque point est représenté par ses coordonnées (x, y, z).
Wireframe et surface 3D : Utilisez les fonctions plot_wireframe et plot_surface pour visualiser des surfaces en 3D, comme des fonctions mathématiques ou des terrains topographiques. Les wireframes montrent la structure de la surface avec des lignes de connexion, tandis que les surfaces affichent une surface solide avec des couleurs et des ombres.
Barres 3D (bar plot) : Utilisez la fonction bar3d pour créer un graphique à barres tridimensionnel, où chaque barre représente une valeur en fonction de ses coordonnées (x, y) et de sa hauteur (z).
Histogrammes 3D : Utilisez la fonction hist3d pour créer des histogrammes en 3D, où chaque "barre" représente une plage de valeurs dans l'espace tridimensionnel.
L'exemple suivant se propose de dessiner une sorte de ressort en 3D.
import numpy as np
import matplotlib.pyplot as plt
# Créer des données pour les axes x, y et z
z = np.linspace(0, 10, 100)
x = np.sin(z)
y = np.cos(z)
# Créer un objet Axes3D pour le graphique 3D
plt.figure("Exemple de courbe en 3D")
axes = plt.axes(projection="3d")
print(axes, type(axes))
# Tracer les lignes en 3D
axes.plot(x, y, z)
# Ajouter des étiquettes pour les axes
axes.set_xlabel("X")
axes.set_ylabel("Y")
axes.set_zlabel("Z")
# Afficher le graphique en 3D
plt.show()
Axes3D(0.125,0.11;0.775x0.77) <class 'mpl_toolkits.mplot3d.axes3d.Axes3D'>
Si vous cliquez sur le graphique précédent, rien ne se passe. C'est normal : une image statique a été produite et a été injectée dans la page HTML du Notebook. Pour autant, vous pouvez changer ce comportement.
%matplotlib qt et %matplotlib inline sont des commandes magiques (magic commands) spécifiques à IPython et Jupyter. Elles permettent de définir le "backend" de Matplotlib, c'est-à-dire le mécanisme utilisé pour afficher les graphiques. Les backends déterminent comment et où les graphiques sont affichés, que ce soit dans une fenêtre séparée, dans le navigateur ou directement dans un notebook Jupyter.
%matplotlib qt : cette commande magique définit le backend de Matplotlib pour utiliser Qt5, une bibliothèque d'interface utilisateur graphique. Lorsque vous utilisez le backend Qt5, les graphiques créés avec Matplotlib seront affichés dans des fenêtres séparées et interactives en dehors du notebook ou de la console IPython. Les fenêtres de graphique Qt5 offrent une interaction plus riche, telle que le zoom, le déplacement et la mise à l'échelle, ainsi que la possibilité de sauvegarder les graphiques dans différents formats de fichiers. Pour utiliser ce backend, vous devez avoir PyQt5 ou PySide2 installé.
%matplotlib inline : cette commande magique définit le backend de Matplotlib pour afficher les graphiques directement dans le notebook Jupyter ou la console IPython, sous la cellule qui a généré le graphique. Les graphiques sont intégrés en tant qu'images statiques (format PNG par défaut) et ne sont pas interactifs. Cependant, cette option est pratique pour créer des documents auto-contenus, tels que des rapports, des tutoriels ou des présentations, où vous souhaitez intégrer des graphiques directement dans le texte et le code.
Pour utiliser ces commandes magiques, il suffit de les exécuter dans une cellule de code IPython ou Jupyter avant de créer vos graphiques avec Matplotlib :
%matplotlib qt
import numpy as np
import matplotlib.pyplot as plt
# Créer des données pour les axes x, y et z
z = np.linspace(0, 10, 100)
x = np.sin(z)
y = np.cos(z)
# Créer un objet Axes3D pour le graphique 3D
plt.figure("Exemple de courbe en 3D")
axes = plt.axes(projection="3d")
# Tracer les lignes en 3D
axes.plot(x, y, z)
# Ajouter des étiquettes pour les axes
axes.set_xlabel("X")
axes.set_ylabel("Y")
axes.set_zlabel("Z")
# Afficher le graphique en 3D
plt.show()
Lorsque vous utilisez un backend interactif comme %matplotlib qt
, vous pouvez contrôler la vue d'un graphique 3D directement avec la souris. Voici comment procéder :
Pour faire pivoter le graphique 3D : cliquez et faites glisser le graphique avec le bouton gauche de la souris enfoncé. En déplaçant la souris, vous modifiez les angles d'élévation et azimutal de la vue.
Pour effectuer un zoom avant ou arrière : cliquez en gardez enfoncé le bouton droit de la souris et faites glisser le graphique.
Pour déplacer le graphique : cliquez en gardez enfoncé la molette de la souris et faites glisser le graphique.
Bien entendu, vous pouvez aussi contrôler l'angle de vu sur le graphique 3D par programmation.
Dans Matplotlib, vous pouvez contrôler la vue d'un graphique 3D en modifiant l'angle d'élévation (elevation) et l'angle azimutal (azimuth). Ces angles déterminent la position de la caméra virtuelle utilisée pour afficher le graphique 3D. Vous pouvez définir ces angles à l'aide des méthodes axes.view_init(elev, azim)
de l'objet correspondant au système d'axes en 3D, où elev est l'angle d'élévation et azim est l'angle azimutal.
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
# Créer des données pour les axes x, y et z
z = np.linspace(0, 10, 100)
x = np.sin(z)
y = np.cos(z)
# Créer un objet Axes3D pour le graphique 3D
plt.figure("Exemple de courbe en 3D")
axes = plt.axes(projection="3d")
# Tracer les lignes en 3D
axes.plot(x, y, z)
# Modifier l'angle de vue du graphique 3D
elevation_angle = 90
azimuthal_angle = 15
axes.view_init(elevation_angle, azimuthal_angle)
# Ajouter des étiquettes pour les axes
axes.set_xlabel("X")
axes.set_ylabel("Y")
axes.set_zlabel("Z")
# Afficher le graphique en 3D
plt.show()
%matplotlib qt
import numpy as np
import matplotlib.pyplot as plt
# Créer des données paramétriques pour les axes t
t = np.linspace(0, 10 * np.pi, 1000)
# Calculer les coordonnées x, y et z en fonction de t
x = np.sin(t) * (np.e ** (np.cos(t)) - 2 * np.cos(4 * t) - np.sin(t / 12) ** 5)
y = np.cos(t) * (np.e ** (np.cos(t)) - 2 * np.cos(4 * t) - np.sin(t / 12) ** 5)
z = t
# Créer un objet Axes3D pour le graphique 3D
plt.figure("Un joli papillon (vu par le haut)")
axes = plt.axes(projection="3d")
# Tracer les spirales paramétriques en 3D
axes.plot(x, y, z, "r")
# Ajouter des étiquettes pour les axes
axes.set_xlabel("X")
axes.set_ylabel("Y")
axes.set_zlabel("Z")
# Afficher le graphique
plt.show()