typestar

mpl_dashboard.py en Python

Un tablero de cuatro paneles a partir de un dataset, guardado como una sola figura.

import matplotlib

matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np

ACENTO = "#7c5cff"
CALIDO = "#e06c75"


def crear_intentos(dias=60, semilla=3):
    """Historial de práctica simulado: mejora, con ruido."""
    rng = np.random.default_rng(semilla)
    tendencia = np.linspace(78, 112, dias)
    tpm = tendencia + rng.normal(scale=4.5, size=dias)
    accuracy = 94 + (tpm - tpm.min()) / (np.ptp(tpm) + 1e-9) * 5
    lenguajes = rng.choice(["python", "rust", "sql", "css"], size=dias,
                       p=[0.45, 0.25, 0.2, 0.1])
    return tpm, accuracy, lenguajes


def panel_progreso(ejes, tpm):
    x = np.arange(len(tpm))
    ejes.plot(x, tpm, color=ACENTO, linewidth=1, alpha=0.6)
    ventana = 7
    suavizado = np.convolve(tpm, np.ones(ventana) / ventana, mode="valid")
    ejes.plot(x[ventana - 1:], suavizado, color=CALIDO, linewidth=2,
              label=f"{ventana} intentos (promedio)")
    ejes.set_title("tokens por minuto", fontsize=10)
    ejes.legend(fontsize=8)


def panel_distribucion(ejes, tpm):
    ejes.hist(tpm, bins=18, color=ACENTO, edgecolor="white")
    ejes.axvline(np.median(tpm), color=CALIDO, linestyle="--",
                 label=f"mediana {np.median(tpm):.0f}")
    ejes.set_title("distribución", fontsize=10)
    ejes.legend(fontsize=8)


def panel_lenguajes(ejes, lenguajes):
    nombres, conteos = np.unique(lenguajes, return_counts=True)
    orden = np.argsort(conteos)[::-1]
    barras = ejes.barh(nombres[orden][::-1], conteos[orden][::-1], color=ACENTO)
    ejes.bar_label(barras, padding=2, fontsize=8)
    ejes.set_title("intentos por lenguaje", fontsize=10)
    ejes.set_xlim(0, conteos.max() * 1.2)


def panel_balance(ejes, tpm, accuracy):
    puntos = ejes.scatter(tpm, accuracy, c=np.arange(len(tpm)),
                          cmap="viridis", s=16)
    ajuste = np.polyfit(tpm, accuracy, 1)
    ejes.plot(tpm, np.polyval(ajuste, tpm), color=CALIDO, linewidth=1.5)
    ejes.set_xlabel("tpm", fontsize=9)
    ejes.set_ylabel("exactitud %", fontsize=9)
    ejes.set_title("velocidad contra exactitud", fontsize=10)
    return puntos


def main():
    tpm, accuracy, lenguajes = crear_intentos()

    figura, ejes = plt.subplots(2, 2, figsize=(10, 6.5))
    panel_progreso(ejes[0, 0], tpm)
    panel_distribucion(ejes[0, 1], tpm)
    panel_lenguajes(ejes[1, 0], lenguajes)
    puntos = panel_balance(ejes[1, 1], tpm, accuracy)

    figura.colorbar(puntos, ax=ejes[1, 1], label="orden de intento")
    figura.suptitle("tablero de práctica", fontsize=13)
    figura.tight_layout()
    figura.savefig("dashboard.png", dpi=150, bbox_inches="tight")
    plt.close(figura)

    print(f"{len(tpm)} intentos, récord {tpm.max():.1f} tpm")
    print(f"mejora {tpm[-7:].mean() - tpm[:7].mean():+.1f} tpm")


if __name__ == "__main__":
    main()

Cómo funciona

  1. Una cuadrícula de subplots con gridspec sostiene paneles de distintos tipos.
  2. Cada panel es una función pequeña, así el layout se mantiene legible.
  3. Un solo savefig al final escribe el tablero completo.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
81
Caracteres a escribir
2551
Tokens
789
Ritmo de tres estrellas
115 tpm

Al ritmo de tres estrellas de 115 tokens por minuto, este intento toma unos 412 segundos.

Escribe este fragmento

Paso 1 de 1 en Bis; paso 14 de 14 en Graficar con matplotlib.

← Anterior