Comprime la estacionalidad con un grafico horizon

Visualize

Comprime la estacionalidad con un grafico horizon

Creado: Última actualización: Tiempo de lectura: 2 min

Si la estacionalidad es grande y el espacio es limitado, el grafico horizon pliega las bandas para compactar. La amplitud se expresa con color e intensidad.

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 48)
baseline = 120 + 30 * np.sin(2 * np.pi * x / 12)
trend = 0.6 * x
rng = np.random.default_rng(7)
series = baseline + trend + rng.normal(0, 8, size=x.size)
centered = series - series.mean()
band = 20
levels = 3
palette_pos = ["#bae6fd", "#38bdf8", "#0ea5e9"]
palette_neg = ["#fecaca", "#f87171", "#ef4444"]

fig, ax = plt.subplots(figsize=(6.2, 3.6))
for level in range(levels):
    upper = np.clip(centered - level * band, 0, band)
    if np.any(upper > 0):
        ax.fill_between(
            x,
            level * band,
            level * band + upper,
            color=palette_pos[level],
            step="mid",
        )
    lower = np.clip(-centered - level * band, 0, band)
    if np.any(lower > 0):
        ax.fill_between(
            x,
            -(level * band + lower),
            -level * band,
            color=palette_neg[level],
            step="mid",
        )

ax.axhline(0, color="#475569", linewidth=1)
positions = range(0, 48, 6)
ax.set_xticks(positions, labels=[f"Mes {idx + 1}" for idx, _ in enumerate(positions)])
ax.set_yticks([])
ax.set_title("Sesiones semanales (desvio respecto a la base)")
ax.set_xlabel("Semana")
ax.spines[["top", "right", "left"]].set_visible(False)

fig.tight_layout()

plt.show()

La intensidad del color representa la amplitud y facilita ver los cambios.

Consejos de lectura #

  • A mayor intensidad, mayor desviacion; asi se detectan picos rapidamente.
  • Debajo de 0 son desviaciones negativas; los colores calidos resaltan las caidas.
  • Alinear varias series facilita comparar patrones estacionales en poco espacio.