Skip to content

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

TareaHerramientaEjemplo
Fijar espaciado por pasoMultipleLocatorCada 5 unidades en x
Limitar a un máximoMaxNLocatorMáx. 6 ticks en y
FechasAutoDateLocatorMeses/años automáticos
Etiquetas personalizadasFuncFormatterAñadir unidades o sufijos
Rotar etiquetastick_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 + ConciseDateFormatter se 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=True o plt.tight_layout().
  • ¿Demasiados ticks? Baja a MaxNLocator(nbins=5) o oculta los minor con ax.tick_params(which="minor", length=0).