Python e IA

Gráficos en Python: Matplotlib vs Plotly

Matplotlib vs Plotly para analistas: gráficos estáticos vs interactivos, ejemplos de líneas y barras lado a lado, opciones de exportación y cuál elegir.

Por Equipo editorial de DashCore HubActualizado 7 min de lectura

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ísticaMatplotlibPlotly
ResultadoImágenes estáticas (PNG, SVG, PDF)HTML interactivo; imágenes estáticas con un paquete adicional
InteractividadMínima por defectoInformación al pasar el mouse, zoom, desplazamiento y leyenda interactiva incluidos
API rápidadf.plot() de pandas, y seaborn encimaPlotly Express (px): una línea por gráfico
Control finoExcelente: cada eje, marca y etiquetaMuy bueno con update_layout y update_traces
Ideal paraReportes, impresión, PDF, figuras académicas, visuales de Python en Power BIExploración, notebooks, apps con Streamlit y Dash, compartir HTML
Curva de aprendizajeSus dos interfaces (pyplot y orientada a objetos) confunden al principioPlotly 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.

Consejo: Guarda las imágenes para documentos en SVG o PDF (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

  1. ¿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.
  2. ¿La gente lo va a explorar? Si los lectores necesitan ver valores exactos o hacer zoom en un rango de fechas, elige Plotly.
  3. ¿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.
  4. ¿Estás creando una app de dashboard? Plotly se integra de forma natural con Dash y Streamlit; mira Crea dashboards web con Streamlit.
  5. ¿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.

Atajo con IA: Los asistentes de IA son muy buenos para el código repetitivo de los gráficos. Prueba un prompt como: "Con Plotly Express, crea un gráfico de líneas a partir de un DataFrame de pandas df con las columnas Month, Region y Revenue: una línea por región, eje Y con formato de dólares, una línea horizontal punteada en el ingreso promedio y una plantilla blanca y limpia. Luego dame la versión en Matplotlib del mismo gráfico". Comparar ambas versiones lado a lado es una forma rápida de aprender las dos librerías.

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

Gráficos en Python con Matplotlib, Seaborn y Plotlypor Dattos.org · Ver en YouTube ↗
Is Plotly The Better Matplotlib?por NeuralNine · Ver en YouTube ↗Video en inglés — activa los subtítulos traducidos en YouTube si los necesitas.

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").

¿Aprendes con la Academia?
Marca esta lección como completada para seguir tu progreso.
Hacer el quiz