Seaborn

Tutorial Seaborn: Ejes, ajustes de ejes

Seaborn: ejes y ajustes de ejes. Aprende a personalizar gráficos modificando límites y escalas de ejes en Seaborn para mejorar visualizaciones y análisis de datos.

Aprende Seaborn GRATIS y certifícate

¿Qué son los ejes en Seaborn?

En Seaborn, los ejes son el componente fundamental donde se trazan las visualizaciones de datos

Un eje es una instancia de la clase matplotlib.axes.Axes, y representa un área individual dentro de una figura en la que se puede dibujar un gráfico. Cuando creas una gráfica con Seaborn, estás trabajando directamente con estos ejes sin necesidad de manipularlos explícitamente.

Por defecto, al generar una gráfica, Seaborn crea automáticamente una figura y un eje asociados. Por ejemplo, al utilizar sns.histplot() para crear un histograma, Seaborn gestiona internamente la creación del eje:

import seaborn as sns
import matplotlib.pyplot as plt

# Cargar conjunto de datos de ejemplo
data = sns.load_dataset('penguins')

# Crear un histograma de la variable 'flipper_length_mm'
sns.histplot(data=data, x='flipper_length_mm')

# Mostrar la gráfica
plt.show()

En este código, Seaborn crea un eje donde se dibuja el histograma de la variable flipper_length_mm. No es necesario especificar el eje porque Seaborn lo maneja automáticamente, facilitando la creación rápida de visualizaciones.

Sin embargo, cuando necesitas un mayor control sobre la disposición y personalización de las gráficas, puedes trabajar directamente con los ejes. Esto se logra creando figuras y ejes explícitamente usando funciones de Matplotlib como plt.subplots(), y luego pasando el eje a las funciones de Seaborn mediante el parámetro ax:

# Crear una figura y un eje
fig, ax = plt.subplots()

# Crear un histograma en el eje especificado
sns.histplot(data=data, x='flipper_length_mm', ax=ax)

# Personalizar el eje
ax.set_title('Distribución del largo de aletas')
ax.set_xlabel('Largo de aleta (mm)')
ax.set_ylabel('Frecuencia')

# Mostrar la gráfica
plt.show()

Al crear el eje ax, puedes personalizar aspectos específicos como el título, las etiquetas y otras propiedades, ofreciendo una mayor flexibilidad en la visualización.

Los ejes son especialmente útiles al construir visualizaciones más complejas, como figuras con múltiples subgráficos. Al utilizar múltiples ejes, puedes organizar varias gráficas en una sola figura, permitiendo comparaciones y análisis más detallados:

# Crear una figura con tres ejes en una fila
fig, axes = plt.subplots(1, 3, figsize=(15, 5))

# Gráfica 1: Histograma del largo de aletas
sns.histplot(data=data, x='flipper_length_mm', ax=axes[0])
axes[0].set_title('Largo de aletas')

# Gráfica 2: Histograma del peso corporal
sns.histplot(data=data, x='body_mass_g', ax=axes[1], color='orange')
axes[1].set_title('Peso corporal')

# Gráfica 3: Gráfico de dispersión largo de aletas vs peso
sns.scatterplot(data=data, x='flipper_length_mm', y='body_mass_g', ax=axes[2], hue='species')
axes[2].set_title('Relación entre largo de aletas y peso')

# Ajustar el layout y mostrar la gráfica
plt.tight_layout()
plt.show()

En este ejemplo, se crean tres ejes dispuestos en una fila. Cada eje contiene una gráfica diferente, y al trabajar directamente con los ejes, podemos personalizar cada uno independientemente, como establecer títulos y ajustar colores.

Trabajar con ejes también es esencial cuando se integran gráficas de Seaborn con otras de Matplotlib. Dado que Seaborn está construido sobre Matplotlib, los ejes permiten combinar gráficos y mantener un estilo visual consistente:

# Crear una figura y un eje
fig, ax = plt.subplots()

# Gráfico de densidad con Seaborn
sns.kdeplot(data=data, x='flipper_length_mm', ax=ax, fill=True, alpha=0.5)

# Añadir una línea vertical con Matplotlib
ax.axvline(data['flipper_length_mm'].mean(), color='red', linestyle='--', label='Media')

# Personalizar el eje
ax.set_title('Distribución y media del largo de aletas')
ax.legend()

# Mostrar la gráfica
plt.show()

Aquí, utilizamos Seaborn para trazar una gráfica de densidad y luego añadimos una línea vertical representando la media con Matplotlib. Al compartir el mismo eje ax, garantizamos que ambos elementos se integren correctamente en la visualización.

Además, los ejes permiten mejorar la accesibilidad y el diseño de las gráficas, ajustando detalles como ticks, etiquetas y formatos:

# Crear una figura y un eje
fig, ax = plt.subplots()

# Gráfico de caja y bigotes
sns.boxplot(data=data, x='species', y='body_mass_g', ax=ax)

# Rotar etiquetas del eje x (forma recomendada)
ax.tick_params(axis='x', rotation=45)

# Ajustar formato de los ticks del eje y
ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))

# Añadir título y etiquetas
ax.set_title('Peso corporal por especie')
ax.set_xlabel('Especie')
ax.set_ylabel('Peso corporal (g)')

# Mostrar la gráfica
plt.tight_layout()  # Ajustar diseño para evitar superposición
plt.show()

En este caso, personalizamos las etiquetas del eje x para mejorar la legibilidad y ajustamos el formato de los ticks del eje y para mostrar los valores con separadores de miles.

Ajustes de límites de ejes

En Seaborn, ajustar los límites de los ejes es fundamental para enfocar el análisis en segmentos específicos de los datos y mejorar la interpretabilidad de las gráficas. Controlar estos límites permite destacar patrones y relaciones que podrían pasar desapercibidos en un rango más amplio.

Para modificar los límites de los ejes en una gráfica de Seaborn, se utiliza el objeto Axes de Matplotlib asociado a la gráfica. A través de los métodos set_xlim() y set_ylim(), es posible establecer los límites del eje x y del eje y respectivamente.

Por ejemplo, si se desea ajustar los límites de un histograma:

import seaborn as sns
import matplotlib.pyplot as plt

# Cargar conjunto de datos
data = sns.load_dataset('tips')

# Crear histograma
ax = sns.histplot(data=data, x='total_bill')

# Establecer límites del eje x
ax.set_xlim(0, 60)

# Mostrar gráfica
plt.show()

En este caso, el eje x se ha limitado entre 0 y 60, enfocando la visualización en ese rango de valores de la variable total_bill.

Es común querer observar un subconjunto de datos en un gráfico de dispersión. Para ello, se ajustan los límites de ambos ejes:

# Crear gráfico de dispersión
ax = sns.scatterplot(data=data, x='total_bill', y='tip')

# Establecer límites de los ejes
ax.set_xlim(10, 40)
ax.set_ylim(0, 10)

# Mostrar gráfica
plt.show()

Aquí, tanto el eje x como el eje y se han restringido para centrarse en cuentas entre 10 y 40 dólares y propinas entre 0 y 10 dólares, respectivamente.

Cuando se trabaja con múltiples subgráficas, es importante mantener coherencia en los límites para facilitar la comparación. Por ejemplo:

# Crear subgráficas
fig, axes = plt.subplots(1, 2, figsize=(12, 5))

# Primer gráfico
sns.scatterplot(data=data, x='total_bill', y='tip', ax=axes[0])
axes[0].set_title('Propinas vs Total de la cuenta')

# Segundo gráfico con una variable adicional
sns.scatterplot(data=data, x='total_bill', y='tip', hue='time', ax=axes[1])
axes[1].set_title('Propinas por momento del día')

# Unificar límites de los ejes
for ax in axes:
    ax.set_xlim(0, 60)
    ax.set_ylim(0, 12)

# Ajustar diseño y mostrar
plt.tight_layout()
plt.show()

En este ejemplo, se han sincronizado los límites de los ejes en ambas subgráficas para que la comparación visual sea más intuitiva.

Además de establecer límites fijos, es posible expandir o contraer los límites actuales utilizando métodos como ax.margins() o ajustando los límites en función de cálculos basados en los datos:

# Obtener límites actuales
x_min, x_max = ax.get_xlim()
y_min, y_max = ax.get_ylim()

# Expandir límites en un 10%
ax.set_xlim(x_min * 0.9, x_max * 1.1)
ax.set_ylim(y_min * 0.9, y_max * 1.1)

Esta técnica es útil para añadir espacio adicional alrededor de los datos, evitando que puntos o líneas queden demasiado ajustados a los bordes de la gráfica.

Es importante recordar que al ajustar los límites se puede alterar la percepción de la gráfica. Por ello, se debe utilizar esta herramienta con cautela para no inducir interpretaciones erróneas.

En ocasiones, es necesario restablecer los límites automáticos después de haber realizado ajustes. Para ello, se utiliza el método ax.relim() seguido de ax.autoscale(), que recalcula los límites basándose en los datos visibles:

# Restablecer límites automáticos
ax.relim()
ax.autoscale()

Esta acción es útil cuando se han añadido o eliminado elementos de la gráfica y se desea que los límites reflejen estos cambios de manera automática.

Finalmente, ajustar los límites de los ejes es una práctica común al preparar gráficas para presentaciones o informes, donde es esencial que la información sea clara y esté enfocada en los aspectos más relevantes.

Ajustes de escalas

En Seaborn, ajustar las escalas de los ejes es fundamental para representar adecuadamente los datos, especialmente cuando estos abarcan varios órdenes de magnitud o siguen distribuciones específicas. Cambiar la escala de los ejes permite visualizar patrones y relaciones que podrían no ser evidentes en una escala lineal.

Para modificar la escala de los ejes en una gráfica de Seaborn, se utilizan los métodos set_xscale() y set_yscale() del objeto Axes. Estos métodos permiten establecer diferentes tipos de escalas, como logarítmica, simbólica (symlog), logit, entre otras.

Por ejemplo, si se desea representar un histograma con una escala logarítmica en el eje y:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# Crear un generador de números aleatorios con una semilla
rng = np.random.default_rng(seed=42)

# Generar datos con distribución exponencial
data = rng.exponential(scale=1.0, size=1000)

# Crear histograma
fig, ax = plt.subplots()
sns.histplot(data, ax=ax)

# Establecer escala logarítmica en el eje y
ax.set_yscale('log')

# Añadir etiquetas y título
ax.set_xlabel('Valor')
ax.set_ylabel('Frecuencia')
ax.set_title('Histograma con escala logarítmica en el eje y')

# Mostrar gráfica
plt.show()

En este ejemplo, la escala del eje y se ha establecido como logarítmica mediante ax.set_yscale('log'), lo que facilita la visualización de frecuencias que abarcan varios órdenes de magnitud.

Si se desea aplicar una escala logarítmica en ambos ejes en un gráfico de dispersión:

# Generar datos
x = np.linspace(1, 1000, 100)
y = x ** 2

# Crear gráfico de dispersión
fig, ax = plt.subplots()
sns.scatterplot(x=x, y=y, ax=ax)

# Establecer escala logarítmica en ambos ejes
ax.set_xscale('log')
ax.set_yscale('log')

# Añadir etiquetas y título
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_title('Gráfico de dispersión con escalas logarítmicas')

# Mostrar gráfica
plt.show()

Aquí, tanto el eje x como el eje y se han configurado con escala logarítmica, lo que permite apreciar la relación potencial entre las variables en una representación lineal en la escala log-log.

Además de la escala logarítmica, existen otras opciones disponibles. Por ejemplo, la escala simbólica (symlog) es útil cuando se tienen datos que incluyen valores muy pequeños, cero o negativos, y se desea una escala logarítmica solo para valores grandes:

# Crear un generador de números aleatorios con una semilla
rng = np.random.default_rng(seed=42)

# Datos con valores negativos y positivos
data = np.concatenate((rng.normal(-1000, 300, 1000), rng.normal(1000, 300, 1000)))

# Crear histograma
fig, ax = plt.subplots()
sns.histplot(data, bins=50, ax=ax)

# Establecer escala simbólica en el eje x
ax.set_xscale('symlog', linthresh=500)

# Añadir etiquetas y título
ax.set_xlabel('Valor')
ax.set_ylabel('Frecuencia')
ax.set_title('Histograma con escala simbólica en el eje x')

# Mostrar gráfica
plt.show()

En este caso, ax.set_xscale('symlog', linthresh=500) establece una escala simbólica en el eje x, donde linthresh define el umbral a partir del cual la escala pasa de lineal a logarítmica.

También es posible utilizar la escala logit, que es útil para datos de proporciones o probabilidades:

# Crear un generador de números aleatorios con una semilla
rng = np.random.default_rng(seed=42)

# Datos de proporciones
data = rng.beta(a=0.5, b=0.5, size=1000)

# Crear histograma
fig, ax = plt.subplots()
sns.histplot(data, bins=50, ax=ax)

# Establecer escala logit en el eje x
ax.set_xscale('logit')

# Configurar límites y ticks
ax.set_xlim(0.001, 0.999)
ax.set_xticks([0.01, 0.1, 0.5, 0.9, 0.99])
ax.get_xaxis().set_major_formatter(plt.ScalarFormatter())

# Añadir etiquetas y título
ax.set_xlabel('Proporción')
ax.set_ylabel('Frecuencia')
ax.set_title('Histograma con escala logit en el eje x')

# Mostrar gráfica
plt.show()

En este ejemplo, la escala logit se aplica al eje x para reflejar adecuadamente la distribución de proporciones entre 0 y 1.

Es importante destacar que al cambiar la escala de los ejes, se deben ajustar otros elementos de la gráfica para mantener la legibilidad. Por ejemplo, al utilizar escalas logarítmicas, es recomendable ajustar los ticks y las etiquetas:

# Ajustar ticks y etiquetas en escala logarítmica
ax.set_yscale('log')
ax.yaxis.set_major_locator(plt.LogLocator(base=10))
ax.yaxis.set_major_formatter(plt.FormatStrFormatter('%.0f'))

Además, al trabajar con escalas diferentes, es posible combinar múltiples escalas en una sola figura. Por ejemplo, al crear subgráficas con diferentes escalas:

# Crear datos
x = np.linspace(0.1, 10, 100)
y1 = np.exp(x)
y2 = np.log(x)

# Crear subgráficas
fig, axes = plt.subplots(1, 2, figsize=(12, 5))

# Gráfica 1 con escala logarítmica en el eje y
sns.lineplot(x=x, y=y1, ax=axes[0])
axes[0].set_yscale('log')
axes[0].set_title('Escala logarítmica en el eje y')
axes[0].set_xlabel('X')
axes[0].set_ylabel('Y1')

# Gráfica 2 con escala logarítmica en el eje x
sns.lineplot(x=x, y=y2, ax=axes[1])
axes[1].set_xscale('log')
axes[1].set_title('Escala logarítmica en el eje x')
axes[1].set_xlabel('X')
axes[1].set_ylabel('Y2')

# Ajustar diseño y mostrar
plt.tight_layout()
plt.show()

Aquí, se comparan dos gráficas: una con escala logarítmica en el eje y y otra en el eje x, permitiendo analizar cómo afecta la escala a la representación de los datos.

Aprende Seaborn GRATIS online

Ejercicios de esta lección Ejes, ajustes de ejes

Evalúa tus conocimientos de esta lección Ejes, ajustes de ejes con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Todas las lecciones de Seaborn

Accede a todas las lecciones de Seaborn y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Accede GRATIS a Seaborn y certifícate

Certificados de superación de Seaborn

Supera todos los ejercicios de programación del curso de Seaborn y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender qué son los ejes en Seaborn y su importancia en la visualización de datos.
  • Aprender a crear y personalizar ejes utilizando Matplotlib y Seaborn.
  • Modificar límites de los ejes para enfocar análisis específicos.
  • Ajustar escalas de los ejes, incluyendo escalas lineales, logarítmicas y simbólicas.
  • Integrar y personalizar gráficos de Seaborn y Matplotlib mediante ejes.
  • Mejorar la legibilidad y el diseño de las gráficas ajustando etiquetas y formatos.