Ticks y formatters en Matplotlib: ejes legibles
Updated on
Ticks amontonados, fechas superpuestas y números sin redondear generan ruido visual. Cuando los ticks caen al azar, el contexto se pierde. La solución: elegir locators (dónde van los ticks) y formatters (cómo se muestran) para que cada eje cuente con claridad.
Locator vs formatter en un vistazo
| Tarea | Herramienta | Ejemplo |
|---|---|---|
| Fijar espaciado por paso | MultipleLocator | Cada 5 unidades en x |
| Limitar a un máximo | MaxNLocator | Máx. 6 ticks en y |
| Fechas | AutoDateLocator | Meses/años automáticos |
| Etiquetas personalizadas | FuncFormatter | Añadir unidades o sufijos |
| Rotar etiquetas | tick_params(rotation=...) | 45° para fechas densas |
Ejes numéricos: espaciar y formatear
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FuncFormatter
import numpy as np
x = np.linspace(0, 50, 200)
y = np.log1p(x) * 3.2
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(x, y, color="tab:blue")
# Ticks cada 10 en x, cada 1.5 en y
ax.xaxis.set_major_locator(MultipleLocator(10))
ax.yaxis.set_major_locator(MultipleLocator(1.5))
# Etiqueta con unidad
ax.yaxis.set_major_formatter(FuncFormatter(lambda val, _: f\"{val:.1f} dB\"))
ax.set_xlabel("Samples")
ax.set_ylabel("Signal (dB)")
ax.grid(True, axis="both", linestyle="--", alpha=0.3)
plt.tight_layout()
plt.show()Consejos:
MaxNLocator(nbins=6)mantiene el eje limpio aunque el rango cambie.- Formatter solo cambia el texto, no la posición de los ticks.
- Pon las unidades en el label o en el formatter, no en ambos.
Fechas: evita solapes
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
dates = pd.date_range("2024-01-01", periods=120, freq="D")
values = pd.Series(range(len(dates))).rolling(7, min_periods=1).mean()
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(dates, values, color="tab:green")
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=1))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%b %Y"))
ax.xaxis.set_minor_locator(mdates.WeekdayLocator(byweekday=mdates.MO, interval=2))
plt.setp(ax.get_xticklabels(), rotation=30, ha="right")
ax.set_ylabel("Promedio 7 días")
ax.grid(True, which="both", axis="x", linestyle=":", alpha=0.4)
plt.tight_layout()
plt.show()Consejos:
- Usa minor locators (p. ej. semanal) para contexto sin saturar etiquetas.
- Rota las fechas 30–45° y
ha="right"para evitar solapes. - Si el rango cambia mucho,
AutoDateLocator+ConciseDateFormatterse adaptan solos.
Ejes dobles: ticks alineados
Con twinx/secondary_yaxis, aplica locators y formatters por eje para que colores, ticks y unidades sigan coherentes. Alinea la leyenda como en la guía de eje secundario.
Lista rápida de depuración
- ¿Saltos raros? Usa un locator determinista (
MultipleLocator). - ¿Etiquetas cortadas?
constrained_layout=Trueoplt.tight_layout(). - ¿Demasiados ticks? Baja a
MaxNLocator(nbins=5)o oculta los minor conax.tick_params(which="minor", length=0).