PairGrid: la base de pairplot
PairGrid es la clase de bajo nivel que impulsa internamente a pairplot(). Mientras que pairplot() proporciona una interfaz rápida que aplica el mismo tipo de gráfico a todas las celdas fuera de la diagonal, PairGrid ofrece control total sobre cada zona de la matriz de pares. Esto permite combinar distintos tipos de visualización en una sola figura, optimizando la información que cada región aporta al análisis.
La diferencia clave es que PairGrid permite asignar funciones diferentes a cada zona de la cuadrícula:
map_diag(): celdas de la diagonalmap_upper(): triángulo superiormap_lower(): triángulo inferiormap_offdiag(): todo excepto la diagonal
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
sns.set_theme(style="ticks")
iris = sns.load_dataset("iris")
penguins = sns.load_dataset("penguins").dropna()
PairGrid básico
# PairGrid con funciones diferentes por zona
g = sns.PairGrid(iris, hue="species", palette="Set2", diag_sharey=False)
g.map_upper(sns.scatterplot, alpha=0.6, s=30)
g.map_lower(sns.kdeplot, fill=True, alpha=0.3)
g.map_diag(sns.histplot, kde=True, fill=True, alpha=0.5)
g.add_legend(title="Especie")
g.fig.suptitle("PairGrid personalizado: scatter (arriba), KDE (abajo), hist (diagonal)", y=1.02)
plt.show()
Funciones personalizadas en PairGrid
from scipy import stats
def corrfunc(x, y, **kwargs):
"""Mostrar coeficiente de correlación en la celda."""
r, p = stats.pearsonr(x, y)
ax = plt.gca()
ax.annotate(
f"r = {r:.2f}\np = {p:.3f}",
xy=(0.5, 0.5),
xycoords="axes fraction",
ha="center",
va="center",
fontsize=12,
fontweight="bold",
color="darkred" if abs(r) > 0.5 else "navy"
)
# Scatter abajo, correlación arriba, histograma diagonal
g = sns.PairGrid(iris.drop("species", axis=1))
g.map_upper(corrfunc) # correlación en triángulo superior
g.map_lower(sns.scatterplot, alpha=0.4, s=20) # scatter en triángulo inferior
g.map_diag(sns.histplot, kde=True, bins=15) # histograma en diagonal
g.fig.suptitle("PairGrid con correlaciones en el triángulo superior", y=1.02)
plt.tight_layout()
plt.show()
Selección de variables con vars
# Usar solo un subconjunto de variables
g = sns.PairGrid(
penguins,
vars=["bill_length_mm", "bill_depth_mm", "flipper_length_mm"],
hue="species",
palette="tab10",
height=3.5
)
g.map_upper(sns.scatterplot, alpha=0.5, s=25)
g.map_lower(sns.kdeplot, fill=True, alpha=0.3)
g.map_diag(sns.kdeplot, fill=True, alpha=0.5)
g.add_legend(title="Especie")
plt.tight_layout()
plt.show()
corner=True: solo triángulo inferior
g = sns.PairGrid(iris, hue="species", palette="Set1", corner=True)
g.map_lower(sns.scatterplot, alpha=0.6)
g.map_diag(sns.kdeplot, fill=True, alpha=0.4)
g.add_legend(title="Especie")
g.fig.suptitle("PairGrid en esquina (sin redundancia)", y=1.02)
plt.show()
JointGrid: la base de jointplot
JointGrid es la clase de bajo nivel que sustenta a jointplot(). Al igual que PairGrid respecto a pairplot, JointGrid permite una personalización completa de los tres componentes de la visualización: el gráfico central (distribución conjunta), el gráfico marginal superior (distribución de x) y el gráfico marginal derecho (distribución de y). Esto hace posible combinar, por ejemplo, un scatter con KDE en el centro con histogramas en los márgenes, o un KDE 2D central con rug plots marginales:
tips = sns.load_dataset("tips")
# JointGrid básico
g = sns.JointGrid(data=tips, x="total_bill", y="tip", height=7)
g.plot_joint(sns.scatterplot, alpha=0.5, s=40)
g.plot_marginals(sns.histplot, kde=True, bins=15)
g.set_axis_labels("Importe total ($)", "Propina ($)")
g.fig.suptitle("JointGrid: scatter + histogramas marginales", y=1.02)
plt.show()
Personalización avanzada de JointGrid
# Gráfico central: scatter con tamaño por group_size
# Marginales: KDE con relleno
g = sns.JointGrid(
data=tips,
x="total_bill",
y="tip",
height=8,
ratio=4, # relación altura central / marginal
space=0.1 # espacio entre central y marginales
)
# Gráfico central personalizado
g.plot_joint(
sns.scatterplot,
size=tips["size"],
sizes=(20, 200),
hue=tips["day"],
palette="tab10",
alpha=0.7
)
# Márgenes con KDE
g.plot_marginals(sns.kdeplot, fill=True, alpha=0.4)
# Líneas de referencia
g.refline(
x=tips["total_bill"].mean(),
y=tips["tip"].mean(),
color="red",
linestyle="--",
linewidth=1.5
)
g.set_axis_labels("Importe total ($)", "Propina ($)", fontsize=12)
g.fig.suptitle("JointGrid personalizado: scatter + KDE marginal + referencias", y=1.02)
plt.show()
JointGrid con hue en los marginales
g = sns.JointGrid(
data=penguins,
x="bill_length_mm",
y="bill_depth_mm",
height=7
)
# Central: KDE por especie
g.plot_joint(sns.kdeplot, hue="species", palette="Set2", fill=True, alpha=0.4, levels=5)
# Marginales: KDE por especie
g.plot_marginals(sns.kdeplot, hue="species", palette="Set2", fill=True, alpha=0.4)
g.set_axis_labels("Longitud del pico (mm)", "Profundidad del pico (mm)")
g.fig.suptitle("JointGrid: KDE central y marginal por especie", y=1.02)
plt.show()
Comparativa: clases de bajo nivel vs funciones de alto nivel
| Función | Equivalente de bajo nivel | Ventaja de la versión de bajo nivel |
|---------|--------------------------|-------------------------------------|
| pairplot() | PairGrid | Diferentes funciones por zona (diagonal, upper, lower) |
| jointplot() | JointGrid | Control total sobre central y marginales independientemente |
| relplot() | FacetGrid | Mapear funciones arbitrarias de Matplotlib |
| displot() | FacetGrid | Mapear funciones arbitrarias de Matplotlib |
| catplot() | FacetGrid | Mapear funciones arbitrarias de Matplotlib |
Alan Sastre
Ingeniero de Software y formador, CEO en CertiDevs
Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Seaborn es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.
Más tutoriales de Seaborn
Explora más contenido relacionado con Seaborn y continúa aprendiendo con nuestros tutoriales gratuitos.
Aprendizajes de esta lección
Crear matrices de pares personalizadas con sns.PairGrid(). Asignar funciones diferentes a la diagonal, el triángulo superior e inferior. Usar JointGrid para personalizar el gráfico central y los marginales independientemente. Combinar múltiples tipos de visualización en una única figura. Elegir entre PairGrid/JointGrid y pairplot/jointplot según el nivel de personalización necesario.