7. Estilo y personalización avanzada

Seaborn trae buenos defaults, pero para producir gráficos profesionales vas a querer controlar paletas de color, estilos y tamaños/tipografías, además de títulos y etiquetas.

A continuación, una guía práctica con ejemplos listos para copiar y pegar (Seaborn ≥ 0.12/0.13).

7.1 Paletas de colores (color_palette, set_palette)

A) Elegir una paleta cualitativa (categorías)

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme(style="whitegrid", context="notebook")

tips = sns.load_dataset("tips")

# Paleta cualitativa “colorblind” (accesible)
sns.set_palette("colorblind")  # global para gráficos siguientes

sns.scatterplot(data=tips, x="total_bill", y="tip", hue="day")
plt.title("Paleta cualitativa (colorblind) para categorías")
plt.show()

B) Paletas secuenciales / divergentes para magnitudes

Secuenciales: de claro → oscuro para valores bajos→altos ("mako", "rocket", "crest", "viridis", …)

Divergentes: resaltar desvíos alrededor de un centro (p. ej. 0) ("vlag", "icefire", "coolwarm", "Spectral")

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme(style="whitegrid")
titanic = sns.load_dataset("titanic")

# Heatmap de correlación (divergente centrada en 0)
corr = titanic.corr(numeric_only=True)
sns.heatmap(corr, cmap="vlag", center=0, annot=True, fmt=".2f")
plt.title("Matriz de correlación con paleta divergente (centrada en 0)")
plt.show()

C) Paleta personalizada con color_palette (lista de colores)

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme(style="whitegrid")
tips = sns.load_dataset("tips")

# Crear paleta desde una lista (hex o nombres CSS)
mi_paleta = sns.color_palette(["#1f77b4", "#ff7f0e", "#2ca02c", "#9467bd"])
sns.set_palette(mi_paleta)

sns.barplot(data=tips, x="day", y="total_bill", hue="sex")
plt.title("Paleta personalizada (lista de colores)")
plt.show()

D) Paletas continuas como colormap con as_cmap=True

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme(style="whitegrid")
tips = sns.load_dataset("tips")

cmap = sns.color_palette("mako", as_cmap=True)
sns.kdeplot(data=tips, x="total_bill", fill=True, cmap=cmap)
plt.title("Colormap continuo (mako) para densidad")
plt.show()
Buenas prácticas de color
  • Categórico → paleta cualitativa (preferir “colorblind”).
  • Magnitud/orden → paleta secuencial.
  • Desvíos alrededor de 0 → divergente centrada en 0.
  • Evitá usar una paleta secuencial para categorías nominales.

7.2 Control de estilos (set_style, set_context)

set_theme es la forma moderna y global de configurar Seaborn. Aun así, podés ajustar estilo y contexto según el uso.

A) Estilos disponibles

  • "whitegrid" (excelente para datos categóricos y comparaciones)
  • "darkgrid" (clásico)
  • "white" (minimalista)
  • "dark"
  • "ticks" (similar a white con ticks marcados)
import seaborn as sns
import matplotlib.pyplot as plt

# Tema global + estilo específico
sns.set_theme(style="whitegrid", context="notebook")

fmri = sns.load_dataset("fmri")
sns.lineplot(data=fmri, x="timepoint", y="signal", hue="event")
plt.title("Estilo whitegrid con context notebook")
plt.show()

B) Contextos: escala de tipografías y elementos

  • "paper" (más chico, para informes)
  • "notebook" (default)
  • "talk" (presentaciones)
  • "poster" (grandes)
import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme(style="whitegrid", context="talk")  # más grande (presentaciones)

tips = sns.load_dataset("tips")
sns.boxplot(data=tips, x="day", y="total_bill")
plt.title("Context 'talk': títulos/etiquetas más grandes")
plt.show()

C) Ajustes locales con context manager

Útil para un gráfico sin afectar el resto.

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme(style="whitegrid", context="notebook")
tips = sns.load_dataset("tips")

with sns.axes_style("white"):
    sns.violinplot(data=tips, x="day", y="total_bill", inner="quartile")
    plt.title("Estilo local: 'white' solo en este gráfico")

plt.show()
Tip: podés combinar set_theme (global) con ajustes finos locales (axes_style, plotting_context) para una página con gráficos variados.

7.3 Ajustes de tamaño, etiquetas y títulos

A) Tamaño de figura, fuentes y rcParams (Matplotlib)

Aunque Seaborn configura defaults, el control fino se hace con Matplotlib.

import seaborn as sns
import matplotlib.pyplot as plt

# Tamaño base de fuente
plt.rcParams["font.size"] = 11
# Tamaño de figura por defecto
plt.rcParams["figure.figsize"] = (7, 4)

sns.set_theme(style="whitegrid")
tips = sns.load_dataset("tips")

sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time")
plt.title("Control de tamaño con rcParams", fontsize=14, weight="bold")
plt.xlabel("Total de la cuenta (USD)", fontsize=12)
plt.ylabel("Propina (USD)", fontsize=12)
plt.legend(title="Momento del día", frameon=True)
plt.tight_layout()
plt.show()

B) Ajustes por gráfico (sin tocar globals)

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme(style="whitegrid")
tips = sns.load_dataset("tips")

fig, ax = plt.subplots(figsize=(6, 4))  # tamaño solo para esta figura
sns.regplot(data=tips, x="total_bill", y="tip", ax=ax, scatter_kws={"alpha": .7, "s": 45})

ax.set_title("Figura con tamaño personalizado", fontsize=13, pad=8)
ax.set_xlabel("Total bill (USD)", fontsize=11)
ax.set_ylabel("Tip (USD)", fontsize=11)
ax.legend_.remove() if ax.legend_ else None  # ejemplo: ocultar leyenda si no aporta
plt.show()

C) Títulos y subtítulos para figuras “nivel alto” (grids)

Cuando usás funciones “nivel figura” como relplot, catplot, lmplot, tenés un objeto FacetGrid o FigureGrid.

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_theme(style="whitegrid", context="notebook")

fmri = sns.load_dataset("fmri")
g = sns.relplot(
    data=fmri, kind="line",
    x="timepoint", y="signal",
    hue="event", col="region", height=3, aspect=1.1
)

g.set_axis_labels("Tiempo", "Señal")
g.set_titles("{col_name}")  # título sobre cada subgráfico
g.figure.suptitle("Evolución de la señal por región y evento", y=1.03, fontsize=14, weight="bold")
plt.show()

D) Legibilidad: rotación de ticks, límites y formato numérico

import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.ticker as mtick

sns.set_theme(style="whitegrid")
tips = sns.load_dataset("tips")

ax = sns.barplot(data=tips, x="day", y="tip", estimator=sum, errorbar=None)

ax.set_title("Propinas totales por día")
ax.set_xlabel("Día")
ax.set_ylabel("Propinas (USD)")

# Rotar etiquetas del eje X si se solapan
for label in ax.get_xticklabels():
    label.set_rotation(0)

# Formato de eje Y (por ejemplo, dólares enteros)
ax.yaxis.set_major_formatter(mtick.StrMethodFormatter("${x:,.0f}"))
plt.tight_layout()
plt.show()

E) Accesibilidad y contraste

  • Preferí paletas colorblind-friendly y suficiente contraste con el fondo.
  • Evitá depender solo del color: sumá style o anotaciones.
  • Usá contextos más grandes (talk/poster) en presentaciones.

7.4 Resumen rápido

Paletas

  • sns.set_palette(...) para aplicar globalmente.
  • sns.color_palette(..., as_cmap=True) para colormaps continuos.
  • Categórico → cualitativa; magnitud → secuencial; desvíos → divergente.

Estilo y contexto

  • sns.set_theme(style=..., context=...) como configuración base.
  • Ajustes locales con sns.axes_style / sns.plotting_context.

Tamaños y textos

  • Global: plt.rcParams.
  • Por gráfico: figsize, fontsize, pad, rotación de ticks.
  • Grids: FacetGrid.set_titles, figure.suptitle, set_axis_labels.

Con estas herramientas tenés control fino y profesional de la estética en Seaborn, manteniendo la productividad de su API de alto nivel