Créer un tracé 3D à l'aide de Seaborn et Matplotlib
Dans cette explication, nous examinons ce qu’est un tracé 3D et nous apprenons également comment créer plusieurs tracés 3D différents à l’aide de seaborn et matplotlib.
Créer un tracé 3D à l’aide de Seaborn et Matplotlib
Commençons par importer Matplotlib, NumPy et Seaborn.
import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np
Nous utilisons maintenant le module aléatoire de NumPy pour créer des données x
, y
et z
, et nous avons un total de 50 points.
mean = 3
number = 50
x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)
Il existe plusieurs tracés 3D différents que nous pouvons créer avec Matplotlib. Chaque fois que nous voulons tracer en 3D avec Matplotlib, nous devrons d’abord commencer par créer un ensemble d’axes à l’aide de la fonction axes()
.
Nous allons utiliser le mot-clé projection
et transmettre la valeur 3D sous forme de chaîne. Cela indiquera à Matplotlib que nous allons créer quelque chose en trois dimensions.
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
Si nous vérifions le type des axes
, nous verrons qu’il s’agit d’axes de sous-parcelles 3D.
print(type(axes))
Production:
<class 'matplotlib.axes._subplots.Axes3DSubplot'>
Nous devrons appeler la fonction scatter3D()
et passer nos points de données x
, y
, et z
. Ce n’est pas facile de représenter lequel est l’axe x
, l’axe y
, etc., donc définissons les étiquettes pour les 3 dimensions.
import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np
seaborn.set_style("darkgrid")
mean = 3
number = 50
x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
print(type(axes))
axes.scatter3D(x1, y1, z1)
axes.set_xlabel("x")
axes.set_ylabel("y")
axes.set_zlabel("z")
plot.show()
Production:
Si nous voulons augmenter la taille des points de dispersion, nous pouvons référencer cet argument s
et l’augmenter à 100.
import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np
seaborn.set_style("darkgrid")
mean = 3
number = 50
x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
print(type(axes))
axes.scatter3D(x1, y1, z1, s=100)
axes.set_xlabel("x")
axes.set_ylabel("y")
axes.set_zlabel("z")
plot.show()
Production:
Nous pouvons faire pivoter cette figure tridimensionnelle en utilisant la méthode view_init()
. Cette méthode accepte deux arguments, le premier sera l’angle de notre élévation, et le second sera l’angle de notre azimut.
Nous allons changer l’angle d’élévation en degrés, pas en radians. Nous voulons probablement aussi faire pivoter cette figure à travers l’horizon, et c’est notre angle d’azimut.
import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np
seaborn.set_style("darkgrid")
mean = 3
number = 50
x1 = np.random.normal(mean, 1, size=number)
y1 = np.random.normal(mean, 1, size=number)
z1 = np.random.normal(mean, 1, size=number)
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
print(type(axes))
axes.scatter3D(x1, y1, z1)
axes.set_xlabel("x")
axes.set_ylabel("y")
axes.set_zlabel("z")
axes.view_init(45, 215)
plot.show()
Production:
Matplotlib fournit une option pour créer un tracé linéaire, et nous allons créer de nouvelles données à montrer. Nous devrons créer z
, un espace linéaire de 0 à 10, puis créer x
et y
en fonction du cosinus et du sinus de l’axe z
.
De la même manière que scatter3D()
nous appelons plot3D()
, cela nous donnera un tracé linéaire.
import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
sb.set_style("whitegrid")
OMEGA = 2
Z1 = np.linspace(0, 10, 100)
X1 = np.cos(OMEGA * Z1)
Y1 = np.sin(OMEGA * Z1)
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
axes.plot3D(X1, Y1, Z1)
# keeps padding between figure elements
plot.tight_layout()
plot.show()
Nous avons maintenant un joli tracé de formation de spirale représenté dans un espace tridimensionnel.
Nous pouvons styliser cette ligne en utilisant les mêmes mots-clés pour un graphique en 2 dimensions. Supposons que nous puissions modifier la largeur de notre ligne et rendre cette spirale un peu plus sombre.
L’argument appelé OMEGA
contrôle essentiellement le nombre de spirales que nous voulons voir dans notre tracé.
import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
sb.set_style("whitegrid")
OMEGA = 4
Z1 = np.linspace(0, 10, 100)
X1 = np.cos(OMEGA * Z1)
Y1 = np.sin(OMEGA * Z1)
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
axes.plot3D(X1, Y1, Z1, lw=3)
# keeps padding between figure elements
plot.tight_layout()
plot.show()
Maintenant, nous pouvons voir des spirales plus épaisses dans notre figure.
Nous pouvons également utiliser Matplotlib pour créer des surfaces et des wireframes en 3 dimensions.
Créons une fonction FUNC_Z()
. Il prendra les valeurs x
et y
et renverra la fonction que nous tracerons à la surface.
def FUNC_Z(x, y):
return 50 - (x ** 2 + y ** 2)
Nous utilisons linspace pour créer 50 intervalles entre -5 et 5 pour x
et y
. Nous devons créer une grille au lieu d’avoir uniquement des valeurs x et y.
Nous pouvons le créer en utilisant la fonction meshgrid()
. Nous devons lui passer les valeurs x
et y
pour qu’il les répète.
X1, Y1 = np.meshgrid(X_VAL, Y_VAL)
Code complet :
import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
def FUNC_Z(x, y):
return 50 - (x ** 2 + y ** 2)
sb.set_style("whitegrid")
N = 50
X_VAL = np.linspace(-5, 5, N)
Y_VAL = np.linspace(-5, 5, N)
X1, Y1 = np.meshgrid(X_VAL, Y_VAL)
Z1 = FUNC_Z(X1, Y1)
axes = plot.axes(projection="3d")
axes.plot_surface(X1, Y1, Z1)
plot.show()
Production:
Créons un tracé filaire en utilisant la fonction plot_wireframe()
. Ce code va ressembler beaucoup à la surface.
import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
def FUNC_Z(x, y):
return 50 - (x ** 2 + y ** 2)
sb.set_style("whitegrid")
N = 50
X_VAL = np.linspace(-5, 5, N)
Y_VAL = np.linspace(-5, 5, N)
X1, Y1 = np.meshgrid(X_VAL, Y_VAL)
Z1 = FUNC_Z(X1, Y1)
axes = plot.axes(projection="3d")
axes.plot_wireframe(X1, Y1, Z1)
plot.show()
Nous avons maintenant un fil de fer plutôt qu’une surface, dont la partie médiane n’est pas remplie.
Nous pouvons changer l’esthétique de ce fil de fer si nous changeons le nombre de points sur notre grille.
import seaborn as sb
import matplotlib.pyplot as plot
import numpy as np
def FUNC_Z(x, y):
return 50 - (x ** 2 + y ** 2)
sb.set_style("whitegrid")
N = 10
X_VAL = np.linspace(-5, 5, N)
Y_VAL = np.linspace(-5, 5, N)
X1, Y1 = np.meshgrid(X_VAL, Y_VAL)
Z1 = FUNC_Z(X1, Y1)
axes = plot.axes(projection="3d")
axes.plot_wireframe(X1, Y1, Z1)
plot.show()
Cela créera une esthétique différente avec beaucoup plus d’espace car nous avons changé la taille de notre grille. Nous avons également la possibilité de prendre notre souris, de cliquer sur cette figure et de la faire glisser.
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn