43 · Matplotlib básico: plot, scatter, bar, hist
Matplotlib es la base de plotting sobre la que todo lo demás se construye — desde una curva de pérdida rápida durante el entrenamiento hasta una figura pulida para un paper. Gráficos de línea, scatter, barras, histogramas y la interfaz orientada a objetos `fig, ax` que escala.
Matplotlib expone **dos interfaces**: una API implícita de máquina de estado (`plt.plot(...)`, `plt.show()`) y una API orientada a objetos explícita (`fig, ax = plt.subplots(); ax.plot(...)`). Producen la misma salida, pero la forma OO gana para cualquier código que dure más que una sesión de REPL — siempre sabes sobre qué eje estás dibujando, puedes pasar objetos `ax` entre funciones, y las grillas de subplots se vuelven triviales. Todo codebase serio de ML usa la API OO.
Sin esto:
Sin los fundamentos de matplotlib, no puedes inspeccionar qué está haciendo tu modelo: sin curvas de pérdida, sin gráficos de frontera de decisión, sin verificaciones de distribución. Pasarás horas depurando numéricamente lo que podrías ver visualmente en cinco segundos.
Matplotlib es la biblioteca de plotting fundamental del stack científico de Python. NumPy te da los números; pandas te da la tabla; matplotlib convierte ambos en imágenes. Casi todas las demás bibliotecas de visualización — Seaborn, Plotly, pandas .plot() — son envoltorios de matplotlib por dentro.
El alias de importación universal es import matplotlib.pyplot as plt. El módulo pyplot es la parte que usarás en casi todos los scripts.
Matplotlib tiene dos formas de dibujar el mismo gráfico:
- Interfaz de máquina de estado / pyplot —
plt.plot(x, y),plt.title(...),plt.show(). Rápida para uso interactivo puntual, pero frágil cuando tienes múltiples subplots o necesitas pasar objetos de gráfico entre funciones. - Interfaz orientada a objetos (OO) —
fig, ax = plt.subplots(); ax.plot(x, y); ax.set_title(...). Explícita:figes el canvas completo,axes un panel de gráfico individual. Preferida en cualquier código que otros humanos (o tú en el futuro) vayan a leer.
Esta lección cubre los cuatro tipos de gráficos principales más la interfaz OO. La siguiente lección cubre la personalización (etiquetas, leyendas, estilos, guardar con calidad de publicación).
Python (in browser)
`np.linspace(inicio, fin, n)` produce `n` puntos espaciados uniformemente — perfecto para graficar funciones. `plt.savefig` escribe la figura en disco; `plt.close()` libera memoria. Usamos `bbox_inches='tight'` para que las etiquetas de ejes nunca queden recortadas.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`plt.scatter` acepta arrays de coordenadas x/y y opcionalmente un color `c=`. Fijar `alpha=0.6` hace visibles los puntos superpuestos. El patrón de dos clusters aquí es cómo se ve un dataset linealmente separable — una frontera de decisión recta puede dividirlos.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
`plt.subplots(filas, cols)` devuelve una tupla `(fig, axes)`. `axes` es un array 2D para grillas mayores de 1×1. `fig.tight_layout()` ajusta automáticamente el espaciado para que los títulos y etiquetas de subplots no se superpongan — llámalo antes de cada `savefig`.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Pasa siempre `dpi` y `bbox_inches='tight'`. Los valores predeterminados (72 dpi, sin recorte) producen figuras borrosas y recortadas.
¿Cuál es la diferencia de comportamiento clave entre `plt.plot(x, y)` y `plt.scatter(x, y)`?
- Importar como `import matplotlib.pyplot as plt` — el alias `plt` es universal.
- Usa `plt.savefig('/tmp/plot.png', dpi=150, bbox_inches='tight')` en lugar de `plt.show()` en scripts y notebooks que corren sin pantalla.
- Prefiere la interfaz OO: `fig, ax = plt.subplots()` y luego `ax.plot(...)` — escala a subplots y es más fácil de testear.
- `plt.subplots(filas, cols)` devuelve un par `(fig, axes)`; itera sobre `axes.flat` para recorrer todos los paneles.
Cada ejecución de entrenamiento produce una curva de pérdida — `ax.plot(epochs, train_loss); ax.plot(epochs, val_loss)`. Los scatter plots de dos features coloreados por clase revelan separabilidad antes de entrenar un solo modelo. Los histogramas de un feature, trazados por clase, exponen el cambio de distribución entre los conjuntos de entrenamiento y prueba — una de las razones más comunes por las que un modelo falla en producción.
Si lo quitas: Sin matplotlib depuras el entrenamiento de ML a ciegas — solo puedes inspeccionar resúmenes escalares, no la forma de las curvas de pérdida, la distribución de los pesos o la estructura de clustering de los embeddings. La depuración visual detecta en segundos problemas que los logs numéricos pasan por alto durante horas.