# graficos-con-python
Gráficos con Python
Volver a la portada del cursoCreación de Gráficos 3D en Plotly
Sección 4 · Avanzando con Plotly
Creación de gráficos 3D en Plotly
Algunos datos tienen tres dimensiones que importan al mismo tiempo: dos variables que explican una tercera, o una superficie que cambia en dos direcciones. Un gráfico 3D estático suele ser difícil de leer, porque la perspectiva esconde puntos. Plotly resuelve ese problema con interactividad: puedes rotar, acercar y pasar el ratón por encima para ver los valores exactos.
Dispersión en 3D con Plotly Express
La forma más rápida de crear un gráfico 3D es px.scatter_3d. Le indicas qué columna va en cada eje y, opcionalmente, qué columna define el color. Cada punto se puede inspeccionar pasando el ratón.
import numpy as np
import pandas as pd
import plotly.express as px
rng = np.random.default_rng(42)
n = 200
df = pd.DataFrame({
"precio": rng.uniform(10, 100, n),
"publicidad": rng.uniform(0, 50, n),
})
df["ventas"] = 500 - 3 * df["precio"] + 6 * df["publicidad"] + rng.normal(0, 20, n)
df["segmento"] = np.where(df["publicidad"] > 25, "alta inversión", "baja inversión")
fig = px.scatter_3d(df, x="precio", y="publicidad", z="ventas", color="segmento",
title="Ventas según precio y publicidad")
fig.write_html("dispersion_3d.html")
print("Puntos:", len(df))
Superficies con graph_objects
Para representar una función de dos variables, como un mapa de relieve o una superficie de costo, se usa go.Surface. Necesita una malla de valores: se construye con np.meshgrid a partir de dos rangos y se calcula la altura en cada punto de la malla.
import numpy as np
import plotly.graph_objects as go
x = np.linspace(-3, 3, 60)
y = np.linspace(-3, 3, 60)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
fig = go.Figure(go.Surface(x=x, y=y, z=Z, colorscale="Viridis"))
fig.update_layout(
title="Superficie z = sen(x) · cos(y)",
scene={"xaxis_title": "x", "yaxis_title": "y", "zaxis_title": "z"},
)
fig.write_html("superficie.html")
print("Malla:", Z.shape)
Controlar la vista y el diseño
En los gráficos 3D, los títulos de los ejes se configuran dentro de scene, no en xaxis como en los gráficos planos. La posición inicial de la cámara se ajusta con scene_camera, lo que te permite presentar el gráfico desde el ángulo que mejor cuenta la historia. Aun así, el lector puede girarlo después.
import numpy as np
import plotly.graph_objects as go
x = np.linspace(-3, 3, 40)
X, Y = np.meshgrid(x, x)
fig = go.Figure(go.Surface(z=np.exp(-(X**2 + Y**2) / 4), colorscale="Blues"))
fig.update_layout(scene_camera={"eye": {"x": 1.6, "y": 1.6, "z": 0.9}},
margin={"l": 0, "r": 0, "t": 40, "b": 0})
fig.write_html("camara.html")
Compartir un gráfico interactivo
fig.write_html genera un archivo HTML autocontenido que cualquiera puede abrir en su navegador, sin instalar Python. Es la forma más simple de entregar un gráfico 3D manteniendo la interactividad. Una imagen estática pierde justamente lo que hace útil al gráfico 3D.
Cuándo usar 3D (y cuándo no)
El 3D se justifica cuando la tercera dimensión aporta información y el lector puede interactuar. Si el gráfico va a imprimirse o proyectarse sin interacción, casi siempre es mejor usar dos gráficos 2D o codificar la tercera variable con el color o el tamaño.
Errores comunes
- Configurar los títulos con
xaxis_titleen un gráfico 3D; en 3D van dentro descene. - Pasar a
go.Surfaceuna lista plana en lugar de una malla de dos dimensiones. - Usar 3D solo por estética en un informe impreso, donde se pierde la rotación.
- Dibujar decenas de miles de puntos en 3D sin necesidad; el navegador se vuelve lento.
Cierre
Con scatter_3d para puntos, Surface para funciones y el control de la escena y la cámara, puedes presentar datos tridimensionales de forma clara e interactiva. En el ejercicio siguiente combinarás estas herramientas con subgráficos y animaciones.