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
- Una cuadrícula de subplots con gridspec sostiene paneles de distintos tipos.
- Cada panel es una función pequeña, así el layout se mantiene legible.
- Un solo savefig al final escribe el tablero completo.
Palabras clave y builtins usados aquí
asdefiflenprintreturn
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.
Paso 1 de 1 en Bis; paso 14 de 14 en Graficar con matplotlib.