seaborn
seaborn construye gráficos estadísticos sobre matplotlib con APIs de datos ordenados (tidy-data) - ideal para análisis exploratorio rápido y valores predeterminados pulidos.
Receta
Tarjeta de referencia rápida - lista para copiar y pegar.
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
sns.set_theme(style="whitegrid", context="notebook")
df = pd.read_csv("sales.csv", parse_dates=["ordered_at"])
g = sns.relplot(data=df, x="ordered_at", y="revenue", hue="region", kind="line")
g.set_axis_labels("Fecha", "Ingresos ($)")
plt.close()Cuándo usar esto:
- EDA rápida en DataFrames de pandas
- Comparaciones de grupos con intervalos de confianza
- Múltiples pequeños facetados (
col,row) - KDE/hist/box/violin para distribuciones
Ejemplo Funcional
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
rng = np.random.default_rng(42)
df = pd.DataFrame(
{
"region": np.repeat(["East", "West"], 200),
"segment": np.tile(np.repeat(["SMB", "Enterprise"], 100), 2),
"revenue": rng.normal(150, 40, 400).clip(10),
}
)
sns.set_theme(style="ticks")
fig, axes = plt.subplots(1, 3, figsize=(12, 4))
sns.histplot(data=df, x="revenue", hue="region", kde=True, ax=axes[0])
axes[0].set_title("Distribución")
sns.boxplot(data=df, x="segment", y="revenue", hue="region", ax=axes[1])
axes[1].set_title("Por segmento")
sns.barplot(
data=df,
x="region",
y="revenue",
estimator="median",
errorbar=("pi", 50),
ax=axes[2],
)
axes[2].set_title("Mediana con intervalo")
sns.despine()
fig.tight_layout()
fig.savefig("eda.png", dpi=150, bbox_inches="tight")
plt.close(fig)Lo que esto demuestra:
- API
data=ordenada en tres tipos de gráficos histplotcon superposición KDE opcionalboxplotconhuepara una segunda categoría- Tupla
errorbarmoderna en lugar del obsoletoci
Inmersión Profunda
Cómo Funciona
- seaborn mapea columnas de DataFrame a roles estéticos (x, y, hue, size, style).
- Las funciones estadísticas agregan internamente (media, mediana, CI de bootstrap).
- Las funciones a nivel de figura (
relplot,catplot,displot) devuelvenFacetGrid. - Las funciones a nivel de ejes (
scatterplot,barplot) aceptanax=para subgráficos.
Selector de Gráficos
| Pregunta | Función |
|---|---|
| Tendencia a lo largo del tiempo | lineplot / relplot(kind="line") |
| Comparación de categorías | barplot, boxplot, violinplot |
| Distribución | histplot, kdeplot, ecdfplot |
| Relación | scatterplot, regplot |
Notas de Python
import seaborn as sns
# Cargar conjunto de datos de ejemplo para enseñanza
tips = sns.load_dataset("tips") # caché de CSV incluido
# Paleta accesible para lectores daltónicos
sns.set_palette("colorblind")Errores Comunes
- Datos anchos vs. ordenados (wide vs. tidy) - seaborn espera una fila por observación. Solución:
melto arreglar el esquema de origen. - Parámetro
ci=obsoleto - eliminado en seaborn 0.13+. Solución: usarerrorbar=("ci", 95)oNone. - Olvido de
plt.closeen relplot - las APIs a nivel de figura crean nuevas figuras silenciosamente. Solución: capturar el valor de retorno yplt.close(). - Gráfico de barras de medias en datos sesgados - la media oculta los valores atípicos. Solución: emparejar con box/violin o mostrar la mediana.
huecategórico enorme - leyendas ilegibles. Solución: filtrar top-N o usar facetas en lugar dehue.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
pandas .plot | Gráficos rápidos mínimos | Necesidad de valores predeterminados de CI estadístico |
| Plotly express | Exploración interactiva | Pipeline de impresión estática |
| Altair | Exportación declarativa a Vega-Lite | Necesidad de ajustes de píxeles de matplotlib |
| matplotlib crudo | Control total de artistas | Boilerplate estadístico repetitivo |
Preguntas Frecuentes
¿Qué son los datos ordenados (tidy data) para seaborn?
- Cada variable es una columna; cada observación es una fila.
- No hay columnas separadas por región a menos que se use
meltde forma ancha.
¿Cómo hago facetas por dos variables?
sns.relplot(data=df, x="x", y="y", col="region", row="segment", kind="scatter")¿Cómo desactivo las bandas de confianza?
sns.lineplot(data=df, x="t", y="v", errorbar=None)¿Puedo pasar un `ax` de matplotlib?
- Las funciones a nivel de ejes aceptan
ax=. - Las funciones a nivel de figura gestionan su propia figura.
¿Cómo guardo la salida de relplot?
g = sns.relplot(...)
g.savefig("out.png", dpi=150)¿Qué paleta debo usar?
colorblindoSet2para categorías.- Mapas de color secuenciales (
viridis) para valores continuos.
¿Cómo muestro una regresión?
sns.regplot(data=df, x="ad_spend", y="revenue")¿Funciona seaborn con Polars?
- Convertir con
.to_pandas()para graficar, a menos que se usen rutas nativas de alt/plotly.
¿Cómo ordeno las categorías?
order = df.groupby("region")["revenue"].median().sort_values().index
sns.barplot(data=df, x="region", y="revenue", order=order)¿Por qué hay diferentes recuentos en barplot?
- La altura de la barra es el estimador (media/mediana), no el recuento de filas crudo.
- Usa
countplotpara recuentos de filas.
Relacionado
- matplotlib - personalización a nivel de ejes
- Conceptos Básicos de Visualización - selección de gráficos
- Plotly - seguimientos interactivos
- Mejores Prácticas de Visualización - escalas honestas
Versiones del Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.