Seaborn: Personalización de gráficos
Aprende a personalizar gráficos en Seaborn: histogramas, boxplot, kdeplot, rugplot, scatterplot, heatmap, relplot, catplot.
Aprende Seaborn GRATIS y certifícateSeaborn ofrece numerosas opciones para personalizar la apariencia de los gráficos, permitiendo adaptar cada visualización a necesidades específicas. A diferencia de Matplotlib, donde la personalización puede requerir mucho código, Seaborn proporciona funciones de alto nivel que simplifican este proceso sin sacrificar la flexibilidad.
La personalización en Seaborn se puede aplicar a distintos niveles: desde cambios globales que afectan a todos los gráficos hasta ajustes específicos para elementos individuales. Esta capacidad permite crear visualizaciones consistentes y profesionales con relativamente poco esfuerzo.
El sistema de temas es el punto de partida para personalizar gráficos en Seaborn. La función set_theme()
permite aplicar cambios globales que afectarán a todos los gráficos subsiguientes:
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# Establecer tema global
sns.set_theme(style="whitegrid", palette="deep")
# Cargar datos de ejemplo
tips = sns.load_dataset("tips")
Seaborn incluye varios estilos predefinidos que cambian el aspecto general de los gráficos. Estos incluyen elementos como el color de fondo, la presencia de líneas de cuadrícula y el estilo de los bordes:
# Estilos disponibles
estilos = ["whitegrid", "darkgrid", "white", "dark", "ticks"]
# Crear una figura para cada estilo
fig, axes = plt.subplots(len(estilos), 1, figsize=(10, 12), sharex=True, sharey=True)
for ax, estilo in zip(axes, estilos):
# Aplicar estilo
sns.set_style(estilo)
# Crear gráfico
sns.barplot(x="day", y="total_bill", data=tips, ax=ax)
ax.set_title(f"Estilo: {estilo}")
plt.tight_layout()
plt.show()
# Restaurar estilo para siguientes ejemplos
sns.set_style("whitegrid")
El contexto de escala permite ajustar el tamaño de los elementos según el medio donde se presentará el gráfico:
# Contextos disponibles
contextos = ["paper", "notebook", "talk", "poster"]
# Crear una figura para cada contexto
fig, axes = plt.subplots(len(contextos), 1, figsize=(10, 12), sharex=True, sharey=True)
for ax, contexto in zip(axes, contextos):
# Aplicar contexto
sns.set_context(contexto)
# Crear gráfico
sns.boxplot(x="day", y="total_bill", data=tips, ax=ax)
ax.set_title(f"Contexto: {contexto}")
plt.tight_layout()
plt.show()
# Restaurar contexto para siguientes ejemplos
sns.set_context("notebook")
Las paletas de colores son fundamentales para la personalización. Seaborn ofrece diversas paletas predefinidas y la capacidad de crear paletas personalizadas:
# Tipos de paletas
paletas = ["deep", "muted", "pastel", "bright", "dark", "colorblind"]
# Crear una figura para cada paleta
fig, axes = plt.subplots(len(paletas), 1, figsize=(10, 12), sharex=True, sharey=True)
for ax, paleta in zip(axes, paletas):
# Aplicar paleta
sns.set_palette(paleta)
# Crear gráfico
sns.barplot(x="day", y="total_bill", hue="sex", data=tips, ax=ax)
ax.set_title(f"Paleta: {paleta}")
plt.tight_layout()
plt.show()
También podemos crear paletas personalizadas utilizando diferentes métodos:
# Paleta personalizada con color_palette
colores = ["#ff9999", "#66b3ff", "#99ff99", "#ffcc99", "#c2c2f0"]
sns.set_palette(sns.color_palette(colores))
# Visualizar la paleta
plt.figure(figsize=(10, 2))
sns.palplot(sns.color_palette())
plt.title("Paleta personalizada con colores específicos")
plt.show()
# Paleta secuencial
plt.figure(figsize=(10, 2))
sns.palplot(sns.color_palette("Blues", 10))
plt.title("Paleta secuencial 'Blues'")
plt.show()
# Paleta divergente
plt.figure(figsize=(10, 2))
sns.palplot(sns.color_palette("RdBu_r", 10))
plt.title("Paleta divergente 'RdBu_r'")
plt.show()
# Paleta circular (husl)
plt.figure(figsize=(10, 2))
sns.palplot(sns.color_palette("husl", 8))
plt.title("Paleta circular 'husl'")
plt.show()
Para personalizar elementos específicos de un gráfico, podemos utilizar parámetros en las funciones de visualización:
# Personalización de un gráfico de dispersión
plt.figure(figsize=(10, 6))
sns.scatterplot(
data=tips,
x="total_bill",
y="tip",
hue="time",
size="size",
sizes=(20, 200),
style="smoker",
palette="viridis",
alpha=0.7,
edgecolor="black",
linewidth=0.5,
markers={"Yes": "X", "No": "o"}
)
plt.title("Relación entre cuenta total y propina", fontsize=16)
plt.xlabel("Importe total", fontsize=14)
plt.ylabel("Propina", fontsize=14)
plt.grid(True, linestyle="--", alpha=0.7)
plt.show()
La personalización de textos es esencial para mejorar la legibilidad y comprensión de los gráficos:
# Personalización de textos
plt.figure(figsize=(10, 6))
g = sns.barplot(x="day", y="total_bill", hue="sex", data=tips)
# Personalizar título y etiquetas de ejes
g.set_title("Gasto promedio por día y género", fontsize=16, fontweight="bold")
g.set_xlabel("Día de la semana", fontsize=14)
g.set_ylabel("Importe medio (€)", fontsize=14)
# Personalizar etiquetas de leyenda
g.legend(title="Género", title_fontsize=12, fontsize=10, loc="upper right")
# Personalizar etiquetas del eje x
g.set_xticklabels(g.get_xticklabels(), rotation=45, ha="right", fontsize=12)
# Personalizar etiquetas del eje y
g.set_yticklabels(g.get_yticklabels(), fontsize=12)
plt.tight_layout()
plt.show()
Para agregar anotaciones a un gráfico, podemos combinar Seaborn con funciones de Matplotlib:
# Gráfico con anotaciones
plt.figure(figsize=(10, 6))
scatter = sns.scatterplot(data=tips, x="total_bill", y="tip")
# Identificar puntos de interés
max_tip = tips.loc[tips["tip"].idxmax()]
min_ratio = tips.loc[(tips["tip"] / tips["total_bill"]).idxmin()]
# Añadir anotaciones
plt.annotate(
"Propina máxima",
xy=(max_tip["total_bill"], max_tip["tip"]),
xytext=(max_tip["total_bill"] + 5, max_tip["tip"] + 1),
arrowprops=dict(arrowstyle="->", color="red", lw=1.5),
fontsize=12
)
plt.annotate(
"Ratio mínimo",
xy=(min_ratio["total_bill"], min_ratio["tip"]),
xytext=(min_ratio["total_bill"] - 10, min_ratio["tip"] + 2),
arrowprops=dict(arrowstyle="->", color="blue", lw=1.5),
fontsize=12
)
plt.title("Relación entre cuenta total y propina con anotaciones", fontsize=16)
plt.show()
Los límites y escalas de los ejes pueden personalizarse para destacar aspectos específicos de los datos:
# Personalización de límites y escalas
plt.figure(figsize=(10, 6))
scatter = sns.scatterplot(data=tips, x="total_bill", y="tip")
# Ajustar límites de ejes
plt.xlim(0, 60)
plt.ylim(0, 10)
# Establecer marcas de eje
plt.xticks(np.arange(0, 61, 10))
plt.yticks(np.arange(0, 11, 2))
# Añadir líneas de referencia
plt.axhline(y=tips["tip"].mean(), color="red", linestyle="--", label=f"Propina media: {tips['tip'].mean():.2f}")
plt.axvline(x=tips["total_bill"].mean(), color="green", linestyle="--", label=f"Cuenta media: {tips['total_bill'].mean():.2f}")
plt.title("Relación entre cuenta total y propina con referencias", fontsize=16)
plt.legend()
plt.tight_layout()
plt.show()
La personalización de mapas de calor incluye ajustes en las escalas de color y anotaciones:
# Datos de correlación
iris = sns.load_dataset("iris")
corr = iris.drop("species", axis=1).corr()
# Personalización de mapa de calor
plt.figure(figsize=(10, 8))
mask = np.triu(np.ones_like(corr, dtype=bool))
cmap = sns.diverging_palette(220, 10, as_cmap=True)
heatmap = sns.heatmap(
corr,
mask=mask,
cmap=cmap,
vmin=-1,
vmax=1,
center=0,
square=True,
linewidths=0.5,
annot=True,
fmt=".2f",
annot_kws={"size": 10},
cbar_kws={"shrink": 0.8, "label": "Coeficiente de correlación"}
)
plt.title("Matriz de correlación de características del iris", fontsize=16)
plt.tight_layout()
plt.show()
Para personalizar gráficos categóricos, Seaborn ofrece numerosas opciones:
# Personalización de gráfico de cajas
plt.figure(figsize=(12, 6))
boxplot = sns.boxplot(
data=tips,
x="day",
y="total_bill",
hue="time",
palette="Set3",
width=0.7,
fliersize=5,
linewidth=1.5
)
# Añadir puntos individuales (swarmplot)
swarmplot = sns.swarmplot(
data=tips,
x="day",
y="total_bill",
hue="time",
dodge=True,
size=4,
edgecolor="black",
linewidth=0.5,
palette=["#000000", "#000000"]
)
# Personalizar leyenda para mantener solo una
handles, labels = boxplot.get_legend_handles_labels()
plt.legend(handles[:2], labels[:2], title="Horario", loc="upper right")
plt.title("Distribución de importes por día y horario", fontsize=16)
plt.tight_layout()
plt.show()
El control de facetas (subgráficos) permite crear paneles múltiples organizados por variables categóricas:
# Personalización de facetas
g = sns.FacetGrid(
tips,
col="time",
row="smoker",
height=4,
aspect=1.2,
sharex=True,
sharey=True,
margin_titles=True,
despine=True
)
# Mapear función de visualización
g.map_dataframe(sns.scatterplot, x="total_bill", y="tip", hue="sex",
size="size", sizes=(20, 200), alpha=0.7)
# Personalizar títulos y etiquetas
g.set_axis_labels("Importe total", "Propina")
g.set_titles(col_template="{col_name}", row_template="{row_name}")
g.add_legend(title="Género", loc="upper right")
g.fig.suptitle("Relación entre importe y propina por categorías", y=1.05, fontsize=16)
plt.tight_layout()
plt.show()
Para gráficos de pares, la personalización puede incluir diferentes tipos de visualizaciones para las diagonales y fuera de la diagonal:
# Personalización de gráfico de pares
g = sns.PairGrid(
iris,
hue="species",
diag_sharey=False,
corner=True,
height=3,
aspect=1
)
# Mapear diferentes visualizaciones
g.map_upper(sns.scatterplot, size=4, alpha=0.7, edgecolor="white", linewidth=0.5)
g.map_lower(sns.kdeplot, fill=Tr
Lecciones de este módulo de Seaborn
Lecciones de programación del módulo Personalización de gráficos del curso de Seaborn.
Ejercicios de programación en este módulo de Seaborn
Evalúa tus conocimientos en Personalización de gráficos con ejercicios de programación Personalización de gráficos de tipo Test, Puzzle, Código y Proyecto con VSCode.