Crear un gráfico 3D usando Seaborn y Matplotlib
En esta explicación, veremos qué es un gráfico 3D y también aprenderemos cómo podemos crear varios gráficos 3D diferentes con la ayuda de seaborn y matplotlib.
Crear un gráfico 3D usando Seaborn y Matplotlib
Comencemos importando Matplotlib, NumPy y Seaborn.
import seaborn as seaborn
import matplotlib.pyplot as plot
import numpy as np
Ahora estamos utilizando el módulo aleatorio de NumPy para crear algunos datos x
, y
, y z
, y tenemos un total de 50 puntos.
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)
Hay varios gráficos 3D diferentes que podemos hacer con Matplotlib. Siempre que queramos graficar en 3D con Matplotlib, primero necesitaremos comenzar creando un conjunto de ejes usando la función axes()
.
Usaremos la palabra clave projection
y pasaremos el valor 3D como una cadena. Esto le dirá a Matplotlib que crearemos algo en tres dimensiones.
plot.figure(figsize=(6, 5))
axes = plot.axes(projection="3d")
Si marcamos el tipo de axes
, veremos que se trata de ejes de subtrama 3D.
print(type(axes))
Producción :
<class 'matplotlib.axes._subplots.Axes3DSubplot'>
Tendremos que llamar a la función scatter3D()
y pasar nuestros puntos de datos x
, y
y z
. No es fácil representar cuál es el eje x
, el eje y
, etc., así que establezcamos las etiquetas para las 3 dimensiones.
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()
Producción:
Si queremos aumentar el tamaño de los puntos de dispersión, podemos hacer referencia a este argumento s
y aumentarlo a 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()
Producción:
Podemos rotar esta figura tridimensional usando el método view_init()
. Este método acepta dos argumentos, el primero será el ángulo de nuestra elevación, y el segundo será el ángulo de nuestro acimut.
Cambiaremos el ángulo de elevación en grados, no en radianes. Probablemente también queramos rotar esta figura a lo largo del horizonte, y ese es nuestro ángulo de acimut.
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()
Producción:
Matplotlib proporciona una opción para crear un gráfico de líneas y crearemos algunos datos nuevos para mostrar. Tendremos que crear z
, un espacio lineal de 0 a 10, y luego crear x
e y
basados en el coseno y el seno del eje z
.
De la misma manera que scatter3D()
llamamos plot3D()
, esto nos dará un gráfico de líneas.
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()
Ahora tenemos una bonita trama en forma de espiral representada en un espacio tridimensional.
Podemos diseñar esta línea usando las mismas palabras clave para un gráfico bidimensional. Supongamos que podemos cambiar el ancho de nuestra línea y hacer que esta espiral sea un poco más oscura.
El argumento llamado OMEGA
básicamente controla cuántas espirales queremos ver en nuestra trama.
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()
Ahora podemos ver espirales más gruesas en nuestra figura.
También podemos usar Matplotlib para crear estructuras alámbricas y superficies tridimensionales.
Vamos a crear una función FUNC_Z()
. Tomará los valores de x
e y
y devolverá la función que dibujaremos en la superficie.
def FUNC_Z(x, y):
return 50 - (x ** 2 + y ** 2)
Usamos linspace para crear 50 intervalos entre -5 y 5 para x
e y
. Necesitamos crear una cuadrícula en lugar de tener solo valores de x e y.
Podemos crearlo usando la función meshgrid()
. Necesitamos pasarle los valores x
e y
para que los repita.
X1, Y1 = np.meshgrid(X_VAL, Y_VAL)
Código completo:
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()
Producción:
Vamos a crear un diagrama de estructura alámbrica usando la función plot_wireframe()
. Este código se verá muy similar a la superficie.
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()
Ahora tenemos una estructura alámbrica en lugar de una superficie, que no tiene la parte central rellena.
Podemos cambiar la estética de esta estructura alámbrica si cambiamos la cantidad de puntos en nuestra cuadrícula.
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()
Creará una estética diferente con mucho más espacio porque hemos cambiado el tamaño de nuestra cuadrícula. También tenemos la opción de tomar nuestro mouse, hacer clic en esta figura y arrastrarla.
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