Seaborn: Creación de gráficos
Aprende a crear visualizaciones y gráficos univariantes, bivariantes, multivariantes en Python con Seaborn la librería de visualizaciones más popular de Python.
Aprende Seaborn GRATIS y certifícateSeaborn ofrece una amplia variedad de funciones especializadas para crear visualizaciones estadísticas de manera sencilla y elegante. Esta biblioteca está diseñada para trabajar estrechamente con estructuras de datos de Pandas, facilitando la exploración y comprensión de datos complejos con un mínimo de código.
A diferencia de Matplotlib, donde cada elemento debe configurarse individualmente, Seaborn utiliza funciones de alto nivel que automatizan muchas decisiones de diseño y cálculos estadísticos. Esto permite centrarse más en el análisis de los datos y menos en los detalles técnicos de la generación de gráficos.
La creación de gráficos en Seaborn se organiza en torno a diferentes categorías según el tipo de datos y relaciones que se deseen visualizar. Para empezar, es recomendable importar las bibliotecas necesarias y cargar algunos datos de ejemplo:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Configuración básica
sns.set_theme()
# Carga de datos de ejemplo
tips = sns.load_dataset("tips")
iris = sns.load_dataset("iris")
titanic = sns.load_dataset("titanic")
Los gráficos de relaciones permiten visualizar la conexión entre dos o más variables numéricas. La función principal es relplot()
, que actúa como punto de entrada para crear gráficos de dispersión y líneas:
# Gráfico de dispersión básico
sns.relplot(
data=tips,
x="total_bill",
y="tip",
hue="smoker",
style="time",
size="size"
)
plt.title("Relación entre importe total y propina")
plt.show()
Para gráficos de líneas que conectan observaciones, podemos utilizar lineplot()
o especificar el parámetro kind="line"
en relplot()
:
# Datos temporales de ejemplo
flights = sns.load_dataset("flights")
flights_pivoted = flights.pivot("month", "year", "passengers")
# Gráfico de líneas
sns.relplot(
data=flights.pivot_table(index="year", columns="month", values="passengers"),
kind="line"
)
plt.title("Evolución de pasajeros por mes y año")
plt.show()
Las distribuciones de variables individuales se pueden representar mediante varios tipos de gráficos. La función principal es displot()
, que permite crear histogramas, estimaciones de densidad del kernel (KDE) y gráficos empíricos de distribución acumulada (ECDF):
# Histograma básico
sns.displot(
data=tips,
x="total_bill",
hue="time",
kind="hist",
kde=True,
bins=20
)
plt.title("Distribución del importe total por horario")
plt.show()
# Gráfico de densidad (KDE)
sns.displot(
data=tips,
x="total_bill",
hue="time",
kind="kde",
fill=True
)
plt.title("Estimación de densidad del importe total por horario")
plt.show()
# Gráfico de distribución acumulada
sns.displot(
data=tips,
x="total_bill",
hue="time",
kind="ecdf"
)
plt.title("Distribución acumulada del importe total por horario")
plt.show()
Para datos categóricos, Seaborn ofrece una amplia gama de visualizaciones especializadas. La función principal es catplot()
, que actúa como punto de entrada para varios tipos de gráficos:
# Gráfico de caja (boxplot)
sns.catplot(
data=tips,
x="day",
y="total_bill",
hue="smoker",
kind="box",
height=6,
aspect=1.5
)
plt.title("Distribución del importe total por día y condición de fumador")
plt.show()
# Gráfico de violín
sns.catplot(
data=tips,
x="day",
y="total_bill",
hue="smoker",
kind="violin",
split=True,
inner="stick",
height=6,
aspect=1.5
)
plt.title("Distribución del importe total por día y condición de fumador")
plt.show()
# Gráfico de barras
sns.catplot(
data=tips,
x="day",
y="total_bill",
hue="smoker",
kind="bar",
height=6,
aspect=1.5,
errorbar="sd"
)
plt.title("Promedio del importe total por día y condición de fumador")
plt.show()
# Gráfico de puntos
sns.catplot(
data=tips,
x="day",
y="total_bill",
hue="smoker",
kind="point",
height=6,
aspect=1.5,
errorbar="sd",
markers=["o", "s"]
)
plt.title("Promedio del importe total por día y condición de fumador")
plt.show()
Los gráficos de dispersión categórica muestran la distribución individual de los puntos:
# Gráfico de dispersión por categorías (stripplot)
sns.catplot(
data=tips,
x="day",
y="total_bill",
hue="smoker",
kind="strip",
jitter=True,
height=6,
aspect=1.5
)
plt.title("Distribución de puntos del importe total por día")
plt.show()
# Gráfico de enjambre (evita superposición)
sns.catplot(
data=tips,
x="day",
y="total_bill",
hue="smoker",
kind="swarm",
height=6,
aspect=1.5
)
plt.title("Distribución de puntos sin superposición por día")
plt.show()
Los gráficos de conteo son útiles para visualizar la frecuencia de valores en variables categóricas:
# Gráfico de conteo
sns.catplot(
data=titanic,
x="class",
hue="survived",
kind="count",
palette="pastel",
height=6,
aspect=1.5
)
plt.title("Conteo de pasajeros por clase y supervivencia")
plt.show()
Para analizar relaciones estadísticas, los gráficos de regresión son fundamentales. Seaborn facilita la visualización de modelos de regresión lineal con funciones como regplot()
y lmplot()
:
# Gráfico de regresión simple
sns.regplot(
data=tips,
x="total_bill",
y="tip",
scatter_kws={"alpha": 0.5},
line_kws={"color": "red"}
)
plt.title("Regresión lineal entre importe total y propina")
plt.show()
# Gráfico de regresión con facetas
sns.lmplot(
data=tips,
x="total_bill",
y="tip",
hue="smoker",
col="time",
row="sex",
height=4
)
plt.show()
Los mapas de calor son excelentes para visualizar datos matriciales y correlaciones:
# Crear matriz de correlación
corr = iris.drop("species", axis=1).corr()
# Mapa de calor básico
plt.figure(figsize=(10, 8))
sns.heatmap(
corr,
annot=True,
fmt=".2f",
cmap="coolwarm",
vmin=-1,
vmax=1,
square=True
)
plt.title("Matriz de correlación de características del iris")
plt.show()
Para datos jerárquicos, el mapa de calor con agrupamiento es muy útil:
# Mapa de calor con clustering
sns.clustermap(
corr,
annot=True,
fmt=".2f",
cmap="coolwarm",
vmin=-1,
vmax=1,
figsize=(10, 10),
method="complete",
cbar_pos=(0.02, 0.8, 0.05, 0.18)
)
plt.title("Agrupamiento jerárquico de correlaciones", pad=50)
plt.show()
Los gráficos de pares son ideales para explorar relaciones entre múltiples variables numéricas simultáneamente:
# Matriz de dispersión con pairplot
sns.pairplot(
iris,
hue="species",
markers=["o", "s", "D"],
diag_kind="kde",
corner=True,
plot_kws={"alpha": 0.7}
)
plt.suptitle("Relaciones entre características por especie", y=1.02)
plt.show()
Para una personalización más avanzada, podemos utilizar la clase PairGrid
:
# Grid de pares personalizada
g = sns.PairGrid(
iris,
hue="species",
vars=iris.columns[:3],
corner=True
)
g.map_diag(sns.histplot)
g.map_offdiag(sns.scatterplot, alpha=0.7)
g.add_legend()
plt.suptitle("Grid personalizada de relaciones", y=1.02)
plt.show()
Los gráficos conjuntos combinan visualizaciones de distribuciones marginales con gráficos de dispersión:
# Gráfico conjunto básico
sns.jointplot(
data=iris,
x="sepal_length",
y="petal_length",
hue="species",
kind="scatter",
height=8,
ratio=3,
marginal_kws=dict(bins=15, fill=True)
)
plt.suptitle("Relación entre longitud de sépalo y pétalo", y=1.02)
plt.show()
# Gráficos conjuntos con diferentes tipos
for kind in ["scatter", "kde", "hex", "reg", "hist"]:
sns.jointplot(
data=tips,
x="total_bill",
y="tip",
kind=kind,
height=6,
ratio=4,
space=0.1
)
plt.suptitle(f"Gráfico conjunto tipo {kind}", y=1.02)
plt.tight_layout()
plt.show()
Para una personalización más detallada, podemos utilizar la clase JointGrid
:
# Grid conjunta personalizada
g = sns.JointGrid(
data=tips,
x="total_bill",
y="tip",
height=8,
ratio=3,
space=0.2
)
g.plot_joint(sns.scatterplot, size=tips["size"], sizes=(10, 200), alpha=0.7)
g.plot_marginals(sns.kdeplot, fill=True)
g.refline(x=tips["total_bill"].mean(), y=tips["tip"].mean())
g.set_axis_labels("Importe total", "Propina")
plt.suptitle("Grid conjunta personalizada", y=1.02)
plt.show()
Para visualizar distribuciones bivariantes, Seaborn ofrece varias opciones:
# Gráfico de densidad bidimensional
sns.displot(
data=tips,
x="total_bill",
y="tip",
kind="kde",
fill=True,
height=6,
aspect=1.5
)
plt.title("Estimación de densidad 2D")
plt.show()
# Histograma bidimensional
sns.displot(
data=tips,
x="total_bill",
y="tip",
kind="hist",
bins=15,
height=6,
aspect=1.5
)
plt.title("Histograma 2D")
plt.show()
# Gráfico hexagonal
sns.displot(
data=tips,
x="total_bill",
y="tip",
kind="hex",
height=6,
aspect=1.5,
cmap="viridis"
)
plt.title("Binning hexagonal")
plt.show()
Para visualizar relaciones multivariantes, podemos combinar varios aspectos en un solo gráfico:
# Gráfico de dispersión con múltiples dimensiones
sns.relplot(
data=tips,
x="total_bill",
y="tip",
hue="day",
size="size",
style="sex",
palette="tab10",
sizes=(20, 200),
col="time",
height=5,
aspect=1.2
)
plt.suptitle("Relación multidimensional", y=1.05)
plt.tight_layout()
plt.show()
Para facetas más avanzadas, Seaborn ofrece la función FacetGrid
que permite crear matrices de gráficos según variables categóricas:
# Grid de facetas personalizada
g = sns.FacetGrid(
tips,
col="sex",
row="smoker",
hue="ti
Lecciones de este módulo de Seaborn
Lecciones de programación del módulo Creación de gráficos del curso de Seaborn.
Ejercicios de programación en este módulo de Seaborn
Evalúa tus conocimientos en Creación de gráficos con ejercicios de programación Creación de gráficos de tipo Test, Puzzle, Código y Proyecto con VSCode.