Matplotlib y Plotly son las dos formas más populares de crear gráficos en Python. Usa Matplotlib cuando necesites imágenes estáticas y con control preciso para reportes, presentaciones y PDF; usa Plotly cuando quieras gráficos interactivos, con detalles al pasar el mouse, zoom y filtros, para el navegador, notebooks o dashboards web. La mayoría de los analistas termina usando ambas, y esta guía te muestra los mismos gráficos en cada una para que decidas rápido.
Matplotlib vs Plotly de un vistazo
| Característica | Matplotlib | Plotly |
|---|---|---|
| Resultado | Imágenes estáticas (PNG, SVG, PDF) | HTML interactivo; imágenes estáticas con un paquete adicional |
| Interactividad | Mínima por defecto | Información al pasar el mouse, zoom, desplazamiento y leyenda interactiva incluidos |
| API rápida | df.plot() de pandas, y seaborn encima | Plotly Express (px): una línea por gráfico |
| Control fino | Excelente: cada eje, marca y etiqueta | Muy bueno con update_layout y update_traces |
| Ideal para | Reportes, impresión, PDF, figuras académicas, visuales de Python en Power BI | Exploración, notebooks, apps con Streamlit y Dash, compartir HTML |
| Curva de aprendizaje | Sus dos interfaces (pyplot y orientada a objetos) confunden al principio | Plotly Express es amigable; los graph objects completos toman más tiempo |
Ambas son gratuitas y de código abierto. Instálalas con pip install matplotlib plotly; Anaconda ya las incluye. Muchos equipos usan una librería para los reportes y la otra para explorar, y es una división muy razonable. No necesitas dominar todas las opciones de ninguna de las dos: unos pocos tipos de gráfico (líneas, barras, dispersión, histograma y diagrama de caja) cubren la mayoría de las preguntas del negocio.
Datos de ejemplo para ambas librerías
Todos los ejemplos usan un pequeño DataFrame de pandas con ventas mensuales por región. Cuando estés listo, reemplázalo por pd.read_csv("tu_archivo.csv").
import pandas as pd
import numpy as np
rng = np.random.default_rng(42)
df = pd.DataFrame({
"Month": pd.date_range("2025-01-01", periods=12, freq="MS").repeat(2),
"Region": ["East", "West"] * 12,
"Revenue": rng.integers(20_000, 60_000, size=24),
})
monthly = df.groupby("Month", as_index=False)["Revenue"].sum()
Si pandas es nuevo para ti, nuestro tutorial de pandas para usuarios de Excel explica groupby y pivot_table.
Matplotlib: gráficos estáticos con control total
Gráfico de líneas
import matplotlib.pyplot as plt
from matplotlib.ticker import StrMethodFormatter
fig, ax = plt.subplots(figsize=(9, 4.5))
ax.plot(monthly["Month"], monthly["Revenue"], marker="o", linewidth=2)
ax.set_title("Monthly revenue")
ax.set_ylabel("Revenue")
ax.yaxis.set_major_formatter(StrMethodFormatter("${x:,.0f}"))
ax.spines[["top", "right"]].set_visible(False)
fig.tight_layout()
fig.savefig("monthly_revenue.png", dpi=200)
plt.show()
Fíjate en el estilo orientado a objetos: creas una figura (fig) y unos ejes (ax) y llamas a sus métodos. Es un poco más largo que el estilo rápido de plt.plot(), pero escala sin problemas a diseños con varios gráficos y es el que recomiendan la mayoría de los usuarios con experiencia.
Barras apiladas por región
by_region = df.pivot_table(index="Month", columns="Region",
values="Revenue", aggfunc="sum")
by_region.index = by_region.index.strftime("%b")
fig, ax = plt.subplots(figsize=(9, 4.5))
by_region.plot(kind="bar", stacked=True, ax=ax, rot=0)
ax.set_title("Revenue by region")
ax.set_xlabel("")
fig.tight_layout()
plt.show()
Convertir el índice de fechas en etiquetas cortas de mes antes de graficar mantiene limpio el eje del gráfico de barras. El método .plot() de pandas usa Matplotlib por dentro, así que siempre puedes ajustar el resultado a través de ax.
Múltiplos pequeños: un gráfico por región
fig, axes = plt.subplots(1, 2, figsize=(11, 4), sharey=True)
for ax, region in zip(axes, ["East", "West"]):
data = df[df["Region"] == region]
ax.plot(data["Month"], data["Revenue"], marker="o")
ax.set_title(region)
ax.tick_params(axis="x", rotation=45)
fig.suptitle("Monthly revenue by region")
fig.tight_layout()
plt.show()
Los múltiplos pequeños suelen leerse mejor que un solo gráfico saturado de líneas. sharey=True pone ambos paneles en la misma escala, para que los lectores comparen las regiones de forma honesta y no se confundan con rangos de ejes distintos.
fig.savefig("chart.svg")). Los archivos vectoriales se ven nítidos con cualquier zoom, mientras que un PNG a 200 dpi o más funciona bien para presentaciones y correos.Plotly: gráficos interactivos en pocas líneas
Gráfico de líneas
import plotly.express as px
fig = px.line(monthly, x="Month", y="Revenue", markers=True,
title="Monthly revenue")
fig.update_layout(yaxis_tickprefix="$", yaxis_tickformat=",.0f")
fig.show()
fig.write_html("monthly_revenue.html")
Barras apiladas por región
fig = px.bar(df, x="Month", y="Revenue", color="Region",
title="Revenue by region")
fig.show()
Plotly Express recibe directamente el DataFrame en formato "largo" y apila las barras por color de forma automática, sin necesidad de pivotar. Pasa el mouse sobre cualquier barra para ver su valor exacto, haz clic en un elemento de la leyenda para ocultar una región y arrastra para hacer zoom. El archivo HTML se abre en cualquier navegador, así que es fácil compartir un gráfico interactivo con alguien que no usa Python.
Para exportar un gráfico de Plotly como PNG estático necesitas el paquete adicional kaleido (pip install kaleido) y luego fig.write_image("chart.png").
Personalizar la información emergente y las líneas de referencia
avg = df["Revenue"].mean() # average per region per month
fig = px.line(df, x="Month", y="Revenue", color="Region",
markers=True, template="plotly_white")
fig.add_hline(y=avg, line_dash="dash", annotation_text="Average")
fig.update_traces(hovertemplate="%{x|%b %Y}<br>$%{y:,.0f}")
fig.show()
hovertemplate controla exactamente lo que aparece en la información emergente, y add_hline dibuja una línea de referencia, como una meta o un promedio. El promedio se calcula con los mismos valores mensuales por región que muestran las líneas, así que la comparación es justa.
Cómo elegir: una guía sencilla
- ¿Dónde vivirá el gráfico? Un PDF, un reporte impreso o un documento de Word apuntan a Matplotlib. Un navegador, un notebook o una app web apuntan a Plotly.
- ¿La gente lo va a explorar? Si los lectores necesitan ver valores exactos o hacer zoom en un rango de fechas, elige Plotly.
- ¿Va dentro de Power BI? El visual de Python de Power BI muestra imágenes estáticas generadas con Matplotlib (o librerías basadas en ella, como seaborn). Revisa Visuales de Python y R en Power BI.
- ¿Estás creando una app de dashboard? Plotly se integra de forma natural con Dash y Streamlit; mira Crea dashboards web con Streamlit.
- ¿Necesitas una figura de calidad de publicación con un estilo exacto? Matplotlib te da control sobre cada píxel.
Elijas la librería que elijas, los principios de diseño son los mismos: un mensaje claro por gráfico, un título descriptivo, ejes con etiquetas, lo mínimo de ruido visual y colores usados con intención.
Errores comunes en ambas librerías
- Ejes de barras recortados: los gráficos de barras deben empezar en cero; si no, diferencias pequeñas parecen enormes. Matplotlib y Plotly suelen empezar las barras en cero, pero revísalo si defines límites personalizados.
- Demasiados colores: más de cinco o seis series en un gráfico se vuelven difíciles de leer. Agrupa las categorías menores en "Otros" o usa múltiplos pequeños.
- Números sin formato: valores como 1234567.891 en un eje hacen más lenta la lectura. Usa el formato de marcas que vimos arriba.
- Títulos genéricos: un título como "Ingresos" dice poco. Uno como "Los ingresos del Oeste cayeron en el tercer trimestre" le indica al lector qué observar.
Para profundizar en estos principios, lee Principios de visualización de datos que sí funcionan.
Dónde entra seaborn
seaborn es una librería de gráficos estadísticos construida sobre Matplotlib. Genera histogramas, diagramas de caja, mapas de calor y gráficos de regresión atractivos con muy poco código, por ejemplo sns.boxplot(data=df, x="Region", y="Revenue"). Como su resultado es una figura de Matplotlib, puedes personalizarla con los mismos métodos de ax que viste arriba y usarla en cualquier lugar donde funcione Matplotlib, incluidos los visuales de Python en Power BI.
Próximos pasos
Elige un gráfico que rehaces a mano cada mes y recréalo en ambas librerías con el código de arriba. Guarda la versión de Matplotlib como PNG para tu reporte y la de Plotly como HTML para los compañeros que prefieren explorar. Cuando sepas cuál prefiere tu público, convierte el script en una función reutilizable para que el gráfico del próximo mes te tome solo unos segundos.
Mira: lecciones en video


Preguntas frecuentes
¿Plotly es mejor que Matplotlib?
Ninguna es mejor en todo. Plotly destaca en gráficos interactivos para el navegador, mientras que Matplotlib destaca en imágenes estáticas con estilo preciso para reportes e impresión.
¿Plotly es gratis?
Sí, la librería de Python de Plotly es de código abierto y gratuita, incluso sin conexión. La empresa que la desarrolla también vende productos comerciales como Dash Enterprise, pero no los necesitas para crear gráficos.
¿Puedo usar Plotly en los visuales de Python de Power BI?
El visual de Python de Power BI muestra imágenes estáticas dibujadas en el dispositivo gráfico predeterminado, por eso allí se usan Matplotlib y seaborn. Usa Plotly en notebooks, archivos HTML y apps web.
¿Cómo guardo un gráfico de Plotly como imagen?
Instala el paquete kaleido con pip install kaleido y luego usa fig.write_image("chart.png"). Si quieres que siga siendo interactivo, usa fig.write_html("chart.html").
Marca esta lección como completada para seguir tu progreso.