Matplotlib en Python es una de las bibliotecas más utilizadas para crear gráficos y figuras científicas. Permite generar líneas, barras, diagramas de dispersión, histogramas, gráficos circulares, paneles con varias figuras y archivos preparados para informes o publicaciones.
Esta guía explica el modelo de figuras y ejes, la personalización de títulos y leyendas, la integración con Pandas, la creación de subplots y la exportación de imágenes. Para visualizaciones interactivas con zoom y etiquetas emergentes, consulta también la guía de Plotly en Python.
Qué es Matplotlib
Matplotlib es una biblioteca de código abierto orientada principalmente a gráficos estáticos. Su interfaz más conocida es matplotlib.pyplot, importada normalmente como plt. La guía oficial de Matplotlib contiene tutoriales y referencias, mientras que la galería oficial de ejemplos muestra figuras completas con su código.
Instalar Matplotlib
Trabaja dentro de un entorno virtual, como se explica en la guía de venv en Python:
python -m pip install matplotlibComprueba la instalación:
import matplotlib
print(matplotlib.__version__)Cuando un editor no encuentra el paquete, revisa que use el mismo intérprete donde ejecutaste pip.
Crear el primer gráfico de líneas
import matplotlib.pyplot as plt
meses = ["Ene", "Feb", "Mar", "Abr", "May", "Jun"]
ventas = [120, 145, 138, 170, 190, 205]
plt.plot(meses, ventas)
plt.title("Ventas mensuales")
plt.xlabel("Mes")
plt.ylabel("Unidades")
plt.show()plot() añade la serie y show() muestra la figura. Todo gráfico debe incluir suficiente contexto para que el lector entienda variables y unidades.
Comprender Figure y Axes
La interfaz orientada a objetos resulta más mantenible:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(meses, ventas)
ax.set_title("Ventas mensuales")
ax.set_xlabel("Mes")
ax.set_ylabel("Unidades")
plt.show()La Figure es el lienzo completo. Un Axes es una zona de dibujo dentro de la figura. Una Figure puede contener uno o varios Axes organizados como subplots.
Añadir marcadores, estilos y cuadrícula
fig, ax = plt.subplots()
ax.plot(
meses,
ventas,
marker="o",
linestyle="--",
linewidth=2,
label="Ventas",
)
ax.set_title("Ventas mensuales")
ax.set_xlabel("Mes")
ax.set_ylabel("Unidades")
ax.grid(True, alpha=0.3)
ax.legend()
plt.show()Utiliza estilos para distinguir información, no como decoración excesiva. Una cuadrícula sutil ayuda a estimar valores; una cuadrícula intensa compite con los datos.
Comparar varias series
online = [90, 100, 105, 125, 142, 150]
tienda = [60, 63, 58, 70, 74, 82]
fig, ax = plt.subplots()
ax.plot(meses, online, marker="o", label="Online")
ax.plot(meses, tienda, marker="s", label="Tienda")
ax.set_title("Ventas por canal")
ax.set_xlabel("Mes")
ax.set_ylabel("Unidades")
ax.legend()
plt.show()Cada serie necesita una etiqueta clara. Si una figura acumula demasiadas líneas, divide el análisis en paneles o resume los datos.
Gráfico de barras
productos = ["Portátil", "Ratón", "Teclado", "Monitor"]
unidades = [35, 110, 78, 52]
fig, ax = plt.subplots()
ax.bar(productos, unidades)
ax.set_title("Unidades por producto")
ax.set_xlabel("Producto")
ax.set_ylabel("Unidades")
plt.show()Las barras comparan categorías. El eje numérico normalmente debe comenzar en cero, porque la longitud de la barra representa magnitud.
Barras agrupadas
import numpy as np
import matplotlib.pyplot as plt
productos = ["Portátil", "Ratón", "Teclado"]
t1 = [30, 95, 70]
t2 = [38, 112, 82]
posiciones = np.arange(len(productos))
ancho = 0.35
fig, ax = plt.subplots()
ax.bar(posiciones - ancho / 2, t1, ancho, label="T1")
ax.bar(posiciones + ancho / 2, t2, ancho, label="T2")
ax.set_xticks(posiciones, productos)
ax.set_ylabel("Unidades")
ax.set_title("Ventas por trimestre")
ax.legend()
plt.show()NumPy genera posiciones consistentes. La guía de NumPy para principiantes explica arrays y operaciones numéricas.
Diagrama de dispersión
horas = [2, 3, 4, 5, 6, 7, 8, 9]
notas = [55, 61, 65, 72, 78, 82, 88, 93]
fig, ax = plt.subplots()
ax.scatter(horas, notas)
ax.set_title("Horas de estudio y notas")
ax.set_xlabel("Horas")
ax.set_ylabel("Nota")
plt.show()La dispersión ayuda a observar relaciones, grupos y valores atípicos. Una tendencia visible no demuestra causalidad.
Histograma
notas = [52, 61, 67, 71, 73, 74, 78, 82, 85, 85, 89, 92, 95]
fig, ax = plt.subplots()
ax.hist(notas, bins=5, edgecolor="black")
ax.set_title("Distribución de notas")
ax.set_xlabel("Nota")
ax.set_ylabel("Frecuencia")
plt.show()La cantidad y los límites de los intervalos cambian la forma aparente. Prueba opciones razonables y no elijas bins para favorecer una conclusión.
Gráfico circular con moderación
etiquetas = ["Web", "Móvil", "Escritorio"]
valores = [55, 30, 15]
fig, ax = plt.subplots()
ax.pie(
valores,
labels=etiquetas,
autopct="%1.0f%%",
startangle=90,
)
ax.set_title("Tráfico por plataforma")
ax.axis("equal")
plt.show()Los gráficos circulares funcionan mejor con pocas proporciones claramente diferentes. Para comparaciones precisas, utiliza barras.
Añadir anotaciones
fig, ax = plt.subplots()
ax.plot(meses, ventas, marker="o")
indice = ventas.index(max(ventas))
ax.annotate(
"Valor máximo",
xy=(meses[indice], ventas[indice]),
xytext=(-60, -35),
textcoords="offset points",
arrowprops={"arrowstyle": "->"},
)
plt.show()Las anotaciones deben destacar eventos importantes, no etiquetar cada punto de forma innecesaria.
Crear subplots
fig, ejes = plt.subplots(1, 2, figsize=(11, 4))
ejes[0].plot(meses, ventas, marker="o")
ejes[0].set_title("Ventas mensuales")
ejes[1].bar(productos, unidades)
ejes[1].set_title("Ventas por producto")
ejes[1].tick_params(axis="x", rotation=30)
fig.tight_layout()
plt.show()figsize controla las dimensiones y tight_layout() reduce solapamientos. Cada subplot es un Axes independiente.
Trabajar con Pandas
import pandas as pd
import matplotlib.pyplot as plt
datos = pd.DataFrame({
"mes": ["Ene", "Feb", "Mar", "Abr"],
"ventas": [120, 145, 138, 170],
"gastos": [75, 83, 80, 95],
})
ax = datos.plot(
x="mes",
y=["ventas", "gastos"],
marker="o",
)
ax.set_title("Ventas y gastos")
ax.set_ylabel("Importe")
plt.show()La guía de Pandas en Python cubre DataFrames, filtros y valores ausentes. Valida tipos antes de graficar, porque números guardados como texto producen ejes incorrectos.
Guardar una figura
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(meses, ventas, marker="o")
ax.set_title("Ventas mensuales")
ax.set_xlabel("Mes")
ax.set_ylabel("Unidades")
fig.savefig(
"ventas-mensuales.png",
dpi=300,
bbox_inches="tight",
)Guarda antes de llamar a show(). Matplotlib también exporta PDF y SVG cambiando la extensión. En procesos que crean muchas figuras, libera recursos:
fig.savefig("grafico.png", dpi=200)
plt.close(fig)Convertir código repetido en función
import matplotlib.pyplot as plt
def crear_linea(x, y, titulo, destino):
fig, ax = plt.subplots(figsize=(9, 5))
ax.plot(x, y, marker="o")
ax.set_title(titulo)
ax.grid(True, alpha=0.3)
fig.tight_layout()
fig.savefig(destino, dpi=200)
plt.close(fig)Las funciones hacen que la generación sea coherente. La guía de docstrings en Python muestra cómo documentarlas.
Errores frecuentes
- Olvidar
show()en un script interactivo. - Guardar después de que el entorno haya limpiado la figura.
- Usar series X e Y con longitudes diferentes.
- Crear etiquetas ilegibles.
- Combinar demasiados colores, marcadores y estilos.
- Depender del estado global de pyplot en código reutilizable.
- No cerrar figuras en un proceso por lotes.
Matplotlib o Plotly
Elige Matplotlib para figuras estáticas, informes impresos, exportación vectorial y control preciso. Elige Plotly cuando el público necesite interacción, zoom y valores emergentes. Un mismo proyecto puede usar ambos sin conflicto.
Conclusión
Matplotlib en Python ofrece una base sólida para visualizar datos. Aprende el modelo Figure/Axes, etiqueta cada gráfico, elige un tipo adecuado para la pregunta y exporta con dimensiones y resolución correctas. Después de dominar estos patrones, la galería oficial resulta una fuente útil para personalizaciones avanzadas.


