Está en la página 1de 10

Graficos 3d

Gráficos en tercera dimensión (3D) con


Python y Matplotlib - Ejemplos Prácticoss
18:55 0

introducción:
Hola amigos de Internet. Les doy la bienvenida a Mi Diario Python, el mejor lugar
para Aprender Python.

En este articulo, veremos los métodos de matplotlib que nos permiten graficar y
visualizar datos en tercera dimensión.

¿Como es un gráfico 3D? Es algo así:

Por supuesto, es necesario disponer de la libreria matplotlib, la cual podemos


instalar desde nuestra consola:

pip install matplotlib

Y también utilizaremos numpy:

pip install numpy

Se recomienda tener un conocimiento previo del manejo de esta libreria.

Te recomiendo ver nuestro articulo sobre matplotlib:

Visualización de Datos con Python y Matplotlib

Gráficos 3D con Matplotlib:


Muy bien, sabemos matplotlib es la mejor herramienta para la visualización de
datos.
Con la visualización de datos en tercera dimensión, podremos ver de manera más
detallada y de manera más interactiva los datos. Por supuesto, no solo nos interesa
el aspecto, si no la utilidad. En algún momento tendremos que graficar datos en 3D.

Con Matplotlib, grafica datos en 3D, es muy fácil. Que mejor que un ejemplo?

from mpl_toolkits.mplot3d import axes3d


import matplotlib.pyplot as plt
from matplotlib import style

# Creamos la figura
fig = plt.figure()

# Agrrgamos un plano 3D
ax1 = fig.add_subplot(111,projection='3d')

# Mostramos el gráfico
plt.show()

Y de esta manera, tenemos un plano tridimensional.

¿Que hace falta? Por supuesto, los datos. Para ello, utilizaremos la libreria numpy y
el metodo plot_wireframe:

# Modulos con los que trabajaremos


from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np

# Creamos la figura
fig = plt.figure()

# Agrrgamos un plano 3D
ax1 = fig.add_subplot(111,projection='3d')

# Datos en array bi-dimensional


x = np.array([[1,2,3,4,5,6,7,8,9,10]])
y = np.array([[5,6,7,8,2,5,6,3,7,2]])
z = np.array([[1,2,6,3,2,7,3,3,7,2]])

# plot_wireframe nos permite agregar los datos x, y, z. Por ello 3D


# Es necesario que los datos esten contenidos en un array bi-dimensional
ax1.plot_wireframe(x, y, z)

# Mostramos el gráfico
plt.show()

Y aquí tenemos nuestro resultado. Muy bonito ¿No?

Scatter en Tercera Dimensión:


Podemos graficar scatter utilizando la misma tecnica anterior. En este caso, no sera
necesario utilizar el método plot_wireframe. Veamos un ejemplo:

# Scatter

# importamos las librerias necesarias


from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt

# Creamos la figura
fig = plt.figure()
# Creamos el plano 3D
ax1 = fig.add_subplot(111, projection='3d')

# Definimos los datos de prueba


x = [1,2,3,4,5,6,7,8,9,10]
y = [5,6,7,8,2,5,6,3,7,2]
z = [1,2,6,3,2,7,3,3,7,2]

# Datos adicionales
x2 = [-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
y2 = [-5,-6,-7,-8,-2,-5,-6,-3,-7,-2]
z2 = [1,2,6,3,2,7,3,3,7,2]

# Agregamos los puntos en el plano 3D


ax1.scatter(x, y, z, c='g', marker='o')
ax1.scatter(x2, y2, z2, c ='r', marker='o')

# Mostramos el gráfico
plt.show()

Y tenemos obtenemos el resultado esperado. Podemos graficar la cantidad de


scatter que sean necesarias, solo utilizando el método scatter.

Barras en Tercera Dimensión:


Si podemos hacer puntos, por que no barras? Las barras son un elemento muy
importante en la graficación de datos. Nos permite ver de manera detallada, los
datos que representa.

Con el método bar3d podemos generar barras 3D de manera muy sencilla. Veamos
un ejemplo:

# Importamos los modulos necesarios


from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax1 = fig.add_subplot(111, projection='3d')

# Definimos los datos


x3 = [1,2,3,4,5,6,7,8,9,10]
y3 = [5,6,7,8,2,5,6,3,7,2]
z3 = np.zeros(10)

dx = np.ones(10)
dy = np.ones(10)
dz = [1,2,3,4,5,6,7,8,9,10]
# utilizamos el método bar3d para graficar las barras
ax1.bar3d(x3, y3, z3, dx, dy, dz)

# Mostramos el gráfico
plt.show()

Y como podemos observar, el resultado es muy bueno.

Espero que te sirvan estos ejemplo como base para que puedas experimentar y
probar tus propios datos.

Mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes
:D.

Un método posible es utilizar la plot_surface . Adaptando la solución dada en esta entrada de


blog,entonces tenga
import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d
import Axes3D fig = plt.figure() ax = fig.add_subplot(111, projection='3d') #
Scatter graph N = 100 X = np.random.uniform(-1, 1, N) Y = np.random.uniform(-1, 1,
N) Z = np.random.uniform(-2, 2, N) ax.scatter(X, Y, Z) # Cylinder x=np.linspace(-
1, 1, 100) z=np.linspace(-2, 2, 100) Xc, Zc=np.meshgrid(x, z) Yc = np.sqrt(1-
Xc**2) # Draw parameters rstride = 20 cstride = 10 ax.plot_surface(Xc, Yc, Zc,
alpha=0.2, rstride=rstride, cstride=cstride) ax.plot_surface(Xc, -Yc, Zc,
alpha=0.2, rstride=rstride, cstride=cstride) ax.set_xlabel("X") ax.set_ylabel("Y")
ax.set_zlabel("Z") plt.show()
He agregado alguna configuración mínima de la superficie, se puede lograr mejor consultando
los documentos .
compartir mejorar esta respuesta
Respondió el 18 de noviembre de 2014 a las 8:22

Greg
7,315 1 27 40
añadir un comentario
5
Mejoré la respuesta de @Greg e hice un cilindro 3D sólido con una superficie superior e inferior
y reescribí la ecuación para que puedas traducir en x, y, y z
from mpl_toolkits.mplot3d import Axes3D import mpl_toolkits.mplot3d.art3d as
art3d import matplotlib.pyplot as plt import numpy as np from matplotlib.patches
import Circle def plot_3D_cylinder(radius, height, elevation=0, resolution=100,
color='r', x_center = 0, y_center = 0): fig=plt.figure() ax = Axes3D(fig, azim=30,
elev=30) x = np.linspace(x_center-radius, x_center+radius, resolution) z =
np.linspace(elevation, elevation+height, resolution) X, Z = np.meshgrid(x, z) Y =
np.sqrt(radius**2 - (X - x_center)**2) + y_center # Pythagorean theorem
ax.plot_surface(X, Y, Z, linewidth=0, color=color) ax.plot_surface(X, (2*y_center-
Y), Z, linewidth=0, color=color) floor = Circle((x_center, y_center), radius,
color=color) ax.add_patch(floor) art3d.pathpatch_2d_to_3d(floor, z=elevation,
zdir="z") ceiling = Circle((x_center, y_center), radius, color=color)
ax.add_patch(ceiling) art3d.pathpatch_2d_to_3d(ceiling, z=elevation+height,
zdir="z") ax.set_xlabel('x-axis') ax.set_ylabel('y-axis') ax.set_zlabel('z-axis')
plt.show() # params radius = 3 height = 10 elevation = -5 resolution = 100 color =
'r' x_center = 3 y_center = -2 plot_3D_cylinder(radius, height,
elevation=elevation, resolution=resolution, color=color, x_center=x_center,
y_center=y_center)

compartir mejorar esta respuesta


Respondió el 13 de noviembre del 15 a las 8:41.

Crypdick
1,004 1 11 29
añadir un comentario
4
Hoy tengo que hacer lo mismo en mi proyecto sobre agregar un cilindro transparente en el
resultado.Este es el código que finalmente obtengo. Así que lo comparto con ustedes solo para
aprender
import numpy as np def
data_for_cylinder_along_z(center_x,center_y,radius,height_z): z = np.linspace(0,
height_z, 50) theta = np.linspace(0, 2*np.pi, 50) theta_grid,
z_grid=np.meshgrid(theta, z) x_grid = radius*np.cos(theta_grid) + center_x y_grid
= radius*np.sin(theta_grid) + center_y return x_grid,y_grid,z_grid import
matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig =
plt.figure() ax = fig.add_subplot(111, projection='3d') Xc,Yc,Zc =
data_for_cylinder_along_z(0.2,0.2,0.05,0.1) ax.plot_surface(Xc, Yc, Zc, alpha=0.5)
plt.show()
Y obtendrás esta hermosa
figura.

compartir mejorar esta respuesta


respondió el 16 de marzo de 18 a las 0:29
Yong Yang
477 4 6
 +1, otras soluciones usan coordenadas cartesianas para obtener Y en función de X, lo que conduce a
una distribución no uniforme de los puntos en la superficie y, lo que es más importante, puede causar
problemas al determinar todos los bordes del cilindro (puede terminar con valores nan debido a
aproximaciones numéricas).Esta solución funciona bien en todos los casos - FernAndr 2 de octubre de
18 a 10:49

También podría gustarte