Gráfico de dispersión 3D en matplotlib

Gráfico de dispersión 3D con scatter o scatter3D

El procedimiento para crear gráficos de dispersión 3D en matplotlib es muy similar al de crear gráficos de dispersión 2D, ya que se utiliza la misma función, pero en el caso de gráficos 3D tendrás que agregar un sub-gráfico con proyección 3D (fig.add_subplot(projection = '3d')) y pasar la variable Z a la función. Ten en cuenta que matplotlib también propociona la misma función pero con el nombre scatter3D.

import matplotlib.pyplot as plt
import numpy as np

# Datos de muestra
np.random.seed(4072023)
x = np.random.normal(size = 200)
y = np.random.normal(size = 200)
z = np.random.normal(size = 200)

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

# Gráfico de dispersión 3D
ax.scatter(x, y, z)

# Equivalente a:
ax.scatter3D(x, y, z)

# plt.show()

Gráfico de dispersión 3D en matplotlib

Agregar un título y etiquetas a los ejes

Si quieres agregar un título o las etiquetas de los ejes puedes usar las funciones title, set_xlabel, set_ylabel y set_zlabel y pasar el texto deseado.

import matplotlib.pyplot as plt
import numpy as np

# Datos de muestra
np.random.seed(4072023)
x = np.random.normal(size = 200)
y = np.random.normal(size = 200)
z = np.random.normal(size = 200)

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

# Gráfico de dispersión 3D
ax.scatter(x, y, z)

# Etiquetas de los ejes
ax.set_xlabel('Etiqueta del eje X')
ax.set_ylabel('Etiqueta del eje Y')
ax.set_zlabel('Etiqueta del eje Z')

# Título
plt.title("Gráfico de dispersión 3D")

# plt.show()

Scatter plot 3D en matplotlib con etiquetas en los ejes

Estilo, tamaño y color de los marcadores

Por defecto, los marcadores de los gráficos de dispersión 3D son círculos azules de tamaño 20, pero puedes personalizar estos ajustes en base a tus preferencias.

El argumento marker de la función se puede utilizar para cambiar el marcador por defecto. Si no sabes qué marcador elegir puedes seleccionar uno de esta lista de marcadores de matplotlib.

Cambiar el estilo de los marcadores de un gráfico de dispersión 3D de Python

import matplotlib.pyplot as plt
import numpy as np

# Datos de muestra
np.random.seed(4072023)
x = np.random.normal(size = 200)
y = np.random.normal(size = 200)
z = np.random.normal(size = 200)

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

# Gráfico de dispersión 3D
ax.scatter(x, y, z, marker = '*')

# plt.show()

Tamaño de los marcadores

Si los marcadores son demasiado grandes o demasiado pequeños puedes elegir el tamaño adecuado pasando un entero al argumento s. El valor por defecto es 20 ‘puntos ** 2’.

Tamaño del los puntos de una nube de puntos 3D hecha con matplotlib

import matplotlib.pyplot as plt
import numpy as np

# Datos de muestra
np.random.seed(4072023)
x = np.random.normal(size = 200)
y = np.random.normal(size = 200)
z = np.random.normal(size = 200)

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

# Gráfico de dispersión 3D
ax.scatter(x, y, z, marker = '^', s = 200)

# plt.show()

Si quieres añadir marcadores diferentes en base a alguna condición o grupo, tendras que dividir tus datos y agregar los puntos de manera separada o mediante un bucle, ya que el argumento markers no admite listas.

Color de los marcadores

El color de los marcadores se puede cambiar pasando un nuevo color a c. Recuerda ver la lista completa de colores de matplotlib para seleccionar el mejor color para tu gráfico.

Color de los marcadores de un gráfico de dispersión 3D hecho con python y matplotlib

import matplotlib.pyplot as plt
import numpy as np

# Datos de muestra
np.random.seed(4072023)
x = np.random.normal(size = 200)
y = np.random.normal(size = 200)
z = np.random.normal(size = 200)

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

# Gráfico de dispersión 3D
ax.scatter(x, y, z, c = 'green')

# plt.show()

Color por grupo o en base a una condición

El argumento c admite una lista de colores como entrada. Esto es muy útil si quieres colorear los marcadores en base a grupos o en base a una condición. En el ejemplo siguiente asignamos colores en base a los valores de z.

Gráfico de dispersión 3D hecho en matplotlib coloreado por grupo

import matplotlib.pyplot as plt
import numpy as np

# Datos de muestra
np.random.seed(4072023)
x = np.random.normal(size = 200)
y = np.random.normal(size = 200)
z = np.random.normal(size = 200)

# Rojo si z > 0 y azul en otro caso
colors = np.where(z > 0, "red", "blue")

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

# Gráfico de dispersión 3D
ax.scatter(x, y, z, c = colors)

# plt.show()

Degradado de color

El color de los marcadores también puede ser en base a una variable continua, creando así un gradiente de color. En el ejemplo de abajo vinculamos el color a los valores que toma la variable z y especificamos la paleta de color viridis a través del argumento cmap.

Scatter plot de tres dimensiones en python

import matplotlib.pyplot as plt
import numpy as np

# Datos de muestra
np.random.seed(4072023)
x = np.random.normal(size = 200)
y = np.random.normal(size = 200)
z = np.random.normal(size = 200)

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

# Gráfico de dispersión 3D
ax.scatter(x, y, z, c = z, cmap = 'viridis')

# plt.show()

Gráfico de dispersión 3D con leyenda

Si los marcadores se colorean en base a una variable agregar una leyenda es una buena opción para que los colores sean más interpretables. Para ello tendrás que usar la función colorbar como en el ejemplo siguiente y personalizar su tamaño con los argumentos shrink y aspect si así lo deseas.

Gráfico de dispersión 3D en matplotlib con leyenda

import matplotlib.pyplot as plt
import numpy as np

# Datos de muestra
np.random.seed(4072023)
x = np.random.normal(size = 200)
y = np.random.normal(size = 200)
z = np.random.normal(size = 200)

fig = plt.figure()
ax = fig.add_subplot(projection = '3d')

# Gráfico de dispersión 3D con leyenda
plot = ax.scatter(x, y, z, c = z, cmap = 'Reds')
fig.colorbar(plot, ax = ax, shrink = 0.5, aspect = 10)

# plt.show()
Fundamentals of Data Visualization

A Primer on Making Informative and Compelling Figures

Comprar en Amazon

También te puede interesar