matplotlib
matplotlib es la biblioteca fundamental de trazado de Python. Controla figuras, ejes y cada elemento gráfico para gráficos estáticos de calidad para publicación.
Receta
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot([1, 2, 3], [4, 1, 3], label="Serie A")
ax.set(xlabel="Mes", ylabel="Ingresos", title="Rendimiento Q1")
ax.legend()
fig.savefig("q1.png", dpi=150, bbox_inches="tight")
plt.close(fig)Cuándo usar esto:
- Control detallado sobre el diseño, fuentes y anotaciones
- PNG/PDF/SVG estáticos para informes y artículos
- Incrustar gráficos en trabajos por lotes de Python sin un navegador
- Capa base para seaborn, pandas
.ploto visualizaciones personalizadas
Ejemplo de trabajo
import matplotlib.pyplot as plt
import numpy as np
months = np.arange(1, 13)
east = np.array([120, 130, 125, 140, 150, 155, 160, 158, 162, 170, 175, 180])
west = np.array([100, 105, 110, 108, 115, 120, 118, 122, 125, 130, 128, 135])
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4), sharey=True)
ax1.plot(months, east, marker="o", color="#2c7bb6", label="Este")
ax1.plot(months, west, marker="s", color="#fdae61", label="Oeste")
ax1.set(xlabel="Mes", ylabel="Ingresos ($k)", title="Tendencias Regionales")
ax1.legend()
ax1.grid(True, alpha=0.3)
width = 0.35
ax2.bar(months - width/2, east, width, label="Este", color="#2c7bb6")
ax2.bar(months + width/2, west, width, label="Oeste", color="#fdae61")
ax2.set(xlabel="Mes", title="Comparación Lado a Lado")
ax2.legend()
fig.suptitle("Panel de Control de Ingresos 2025", fontsize=14)
fig.tight_layout()
fig.savefig("dashboard.png", dpi=200, bbox_inches="tight")
plt.close(fig)Lo que esto demuestra:
- API orientada a objetos con
figyaxexplícitos - Subplots con
shareypara escalas comparables - Gráficos de líneas mixtos y de barras agrupadas en una sola figura
suptitle,tight_layouty exportación de alta resolución (dpi)
Inmersión profunda
Cómo funciona
Figurecontiene los elementos gráficos (artists);Axesproporciona el sistema de coordenadas y los métodos de trazado.- La máquina de estados de pyplot (
plt.plot) funciona bien en notebooks; prefiere la API orientada a objetos en módulos. - Los elementos gráficos (líneas, parches, texto) se actualizan en
draw-savefigrenderiza fuera de pantalla. - Los estilos se encuentran en
matplotlib.rcParamso en hojas de estilo.
Métodos comunes de Axes
| Método | Propósito |
|---|---|
plot | Líneas y marcadores |
bar / barh | Comparaciones categóricas |
hist | Distribuciones |
scatter | Dos variables numéricas |
annotate | Anotaciones |
Notas de Python
import matplotlib.pyplot as plt
# Backend no interactivo para servidores
import matplotlib
matplotlib.use("Agg")
# Formateo de fechas en el eje x
import matplotlib.dates as mdates
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m"))Trampas comunes
- Fugas de estado de pyplot entre celdas - figuras anteriores se mezclan con nuevos gráficos. Solución: siempre usa
fig, ax = plt.subplots()yplt.close(fig). tight_layoutolvidado - las etiquetas de los ejes se recortan en los PNG guardados. Solución:fig.tight_layout()oconstrained_layout=Trueal crear la figura.- Tamaños de marcador enormes en scatter - oscurecen la densidad. Solución: reduce
sy aumentaalpha. - Bucle sin
close- miles de figuras agotan la RAM. Solución:plt.close(fig)en cada iteración. - DPI incorrecto para impresión - 72 DPI se ve borroso en papel. Solución: PNG de 300 DPI o PDF vectorial.
Alternativas
| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| seaborn | Valores predeterminados estadísticos y facetas | Necesitas control de bajo nivel de los elementos gráficos |
| Plotly | Interacción con hover/zoom | Artículos de LaTeX estáticos |
| Altair | Especificaciones de gramática declarativa | Anotaciones muy personalizadas |
| ggplot (plotnine) | Familiaridad con ggplot de R | El equipo está estandarizado en matplotlib |
Preguntas frecuentes
¿Figure vs Axes vs pyplot?
Figurees el contenedor;Axeses un área de trazado.pyplotes un atajo con estado - conveniente pero frágil en aplicaciones.
¿Cómo configuro el tamaño de fuente global?
import matplotlib.pyplot as plt
plt.rcParams.update({"font.size": 12})¿Cómo roto las etiquetas de los ticks del eje x?
ax.tick_params(axis="x", rotation=45)¿Cómo añado un segundo eje y?
ax2 = ax.twinx()
ax2.plot(x, other_series, color="tab:orange")¿Puede matplotlib hacer subplots en una cuadrícula?
fig, axes = plt.subplots(2, 2, figsize=(8, 8))
axes[0, 1].plot(x, y)¿Cómo coloreo por categoría?
- Itera sobre las categorías y traza llamadas
ax.plotseparadas con etiquetas. - O usa seaborn/pandas para el manejo automático del color (hue).
¿Por qué mi gráfico está vacío en CI?
- Falta el backend
Aggen servidores sin cabeza (headless). - Olvidaste llamar a
savefigantes declose.
¿Cómo incrusto en Jupyter?
%matplotlib inlinepara estático; evita DPI altos en notebooks.- Aún así, cierra las figuras al generar muchas en un bucle.
¿Cómo configuro una escala logarítmica?
ax.set_yscale("log")¿pandas.plot usa matplotlib?
- Sí, devuelve objetos Axes que puedes ajustar aún más.
Relacionado
- seaborn - gráficos estadísticos sobre matplotlib
- Conceptos básicos de visualización - selección de gráficos
- Trazado de datos grandes - submuestreo
- Mejores prácticas de visualización - ejes honestos
Versiones de la pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.