Comme nous avons commencer à le voir dans le tuto précédent, il est possible de produire des graphiques en 3D avec MatPlotLib. Nous allons maintenant nous intérêsser aux nuages de points en 3D.
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import proj3d
# Notre jeu de données aléatoires
x = np.random.randn(100)
y = np.random.randn(100)
z = np.random.randn(100)
# Créer un objet Axes3D pour le graphique 3D
plt.figure(figsize=(7, 7))
axes = plt.axes(projection="3d")
# On affiche notre nuage de points en 3D
axes.scatter(x, y, z)
plt.show()
Comme vu dans le tuto précédent, vous pouvez afficher votre graphique avec un backend Qt. Lorsque vous utilisez un backend interactif comme %matplotlib qt
, vous pouvez contrôler le point de vue sur 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.
%matplotlib qt
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import proj3d
# Notre jeu de données aléatoires
x = np.random.randn(100)
y = np.random.randn(100)
z = np.random.randn(100)
# Créer un objet Axes3D pour le graphique 3D
plt.figure("Exemple 3D")
axes = plt.axes(projection="3d")
# On affiche notre nuage de points en 3D
axes.scatter(x, y, z)
plt.show()
Dans cet exemple, nous générons deux classes de points en utilisant des distributions normales multivariées avec numpy.random.multivariate_normal. La première classe de points a une moyenne (0, 0, 0) et la deuxième classe de points a une moyenne (3, 3, 3). Les deux classes de points partagent la même matrice de covariance, ce qui signifie qu'ils ont la même dispersion dans les trois dimensions. Nous traçons les points de chaque classe avec des couleurs différentes (rouge pour la première classe, bleu pour la deuxième classe) en utilisant la méthode axes.scatter
.
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
num_points = 100
cov_mat = np.eye(3)
# Créer des données pour les axes x, y et z pour la première classe de points
mean1 = np.array([0, 0, 0])
points1 = np.random.multivariate_normal(mean1, cov_mat, num_points)
# Créer des données pour les axes x, y et z pour la deuxième classe de points
mean2 = np.array([3, 3, 3])
points2 = np.random.multivariate_normal(mean2, cov_mat, num_points)
# Créer un objet Axes3D pour le graphique 3D
plt.figure("Exemple de nuages de points en cluster et en 3D")
axes = plt.axes(projection="3d")
# Tracer les points de la première classe en rouge
axes.scatter(points1[:, 0], points1[:, 1], points1[:, 2], c="red", label="Cluster 1")
# Tracer les points de la deuxième classe en bleu
axes.scatter(points2[:, 0], points2[:, 1], points2[:, 2], c="blue", label="Cluster 2")
# Ajouter des étiquettes pour les axes
axes.set_xlabel('X')
axes.set_ylabel('Y')
axes.set_zlabel('Z')
# Ajouter une légende
axes.legend()
# Afficher le graphique
plt.show()
Dans ce premier exemple, nous créons un nuage de points en 3D qui représente une distribution en forme de tore. Les coordonnées x, y et z sont générées à partir de deux angles aléatoires theta et phi et des paramètres du tore R et r.
La méthode axes.scatter
est utilisée pour tracer les points en 3D, et la palette de couleurs 'hsv' est utilisée pour colorer les points en fonction de l'angle theta. Les étiquettes d'axe sont ajoutées pour faciliter l'interprétation du graphique (même si dans notre cas, elles sont un peu bidon).
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# Nombre de points
num_points = 1000
# Paramètres du tore
R = 5 # Rayon du tore
r = 2 # Rayon du tube
# Angle theta et phi aléatoire
theta = 2 * np.pi * np.random.rand(num_points)
phi = 2 * np.pi * np.random.rand(num_points)
# Coordonnées x, y et z pour la distribution en forme de tore
x = (R + r * np.cos(theta)) * np.cos(phi)
y = (R + r * np.cos(theta)) * np.sin(phi)
z = r * np.sin(theta)
# Créer un objet Axes3D pour le graphique 3D
plt.figure("Un nuage de point sur un thor", figsize=(10, 10))
axes = plt.axes(projection="3d")
# Tracer les points en 3D
axes.scatter(x, y, z, c=theta, cmap='hsv')
# Modifier l'angle de vue du graphique 3D
elevation_angle = 65
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
plt.show()
Dans cet exemple, nous créons un nuage de points en 3D qui représente la surface d'une sphère. Les coordonnées x, y et z sont générées à partir de deux angles aléatoires theta et phi et du rayon de la sphère radius. La méthode ax.scatter est utilisée pour tracer les points en 3D, et la palette de couleurs 'hsv' est utilisée pour colorer les points en fonction de l'angle theta. L'option alpha=0.6 est utilisée pour rendre les points semi-transparents et donner une impression de profondeur. Les étiquettes d'axe sont ajoutées pour faciliter l'interprétation du graphique.
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# Nombre de points
num_points = 1000
# Rayon de la sphère
radius = 5
# Angle theta et phi aléatoire
theta = 2 * np.pi * np.random.rand(num_points)
phi = np.arccos(2 * np.random.rand(num_points) - 1)
# Coordonnées x, y et z pour la distribution en forme de sphère
x = radius * np.sin(phi) * np.cos(theta)
y = radius * np.sin(phi) * np.sin(theta)
z = radius * np.cos(phi)
# Créer un objet Axes3D pour le graphique 3D
plt.figure("Un nuage de point sur un cercle", figsize=(10, 10))
axes = plt.axes(projection="3d")
# Tracer les points en 3D
axes.scatter(x, y, z, c=theta, cmap='hsv', alpha=0.6)
# Ajouter des étiquettes pour les axes
axes.set_xlabel('X')
axes.set_ylabel('Y')
axes.set_zlabel('Z')
# Afficher le graphique
plt.show()