# graficos-en-matplotlib
Gráficos en Matplotlib
Volver a la portada del cursoUso de Matplotlib con Pandas
Sección 5 · Integración y Exportación
Uso de Matplotlib con Pandas
Las ventas de PyShop viven en un DataFrame de 6000 filas, y casi todos los gráficos del curso empiezan con el mismo paso: agrupar con pandas y pasar el resultado a Matplotlib. pandas puede hacer ese último paso por ti. Series.plot() y DataFrame.plot() son una capa delgada sobre Matplotlib: dibujan con una línea de código y devuelven un Axes normal, que se sigue personalizando con todo lo que ya conoces. Esta lectura muestra cuándo esa capa ahorra trabajo y cuándo conviene volver a Matplotlib puro.
1. Series.plot y DataFrame.plot
Una Series se dibuja con su índice en el eje x y sus valores en el eje y. Un DataFrame dibuja una serie por columna y agrega la leyenda con los nombres de las columnas:
import matplotlib.pyplot as plt
ventas = generar_ventas()
mes = ventas["fecha"].dt.month
mensual = ventas.groupby(mes)["total"].sum() / 1e6
fig, ax = plt.subplots()
mensual.plot(ax=ax, marker="o", title="Ingreso mensual (M)")
print(type(ax).__name__, len(ax.lines)) # Axes 1
print(ax.get_xlabel()) # fecha
pandas usa el nombre del índice como etiqueta del eje x: aquí sale «fecha», porque el groupby se hizo sobre esa columna. Se corrige igual que siempre, con ax.set_xlabel("Mes").
2. El argumento kind=
El tipo de gráfico se elige con kind= o con el método equivalente (df.plot.bar(), df.plot.hist()…). Los valores disponibles son line (el de defecto), bar, barh, hist, box, kde, density, area, scatter, hexbin y pie. scatter y hexbin solo existen en DataFrame, porque necesitan dos columnas (x= e y=).
cat = ventas.groupby("categoria")["total"].sum() / 1e6
fig, ax = plt.subplots()
cat.sort_values().plot(kind="barh", ax=ax)
print(len(ax.patches)) # 5
fig, ax = plt.subplots()
ventas["total"].plot(kind="hist", bins=30, ax=ax)
print(len(ax.patches)) # 30
3. De groupby y pivot_table al gráfico
La forma de la tabla decide el gráfico. Para comparar las cinco categorías mes a mes, se necesita una fila por mes y una columna por categoría; eso es exactamente lo que produce pivot_table:
tabla = ventas.pivot_table(index=mes, columns="categoria",
values="total", aggfunc="sum") / 1e3
print(tabla.shape) # (12, 5)
fig, ax = plt.subplots()
tabla.plot(ax=ax)
print(len(ax.lines)) # 5
print([t.get_text() for t in ax.get_legend().get_texts()])
# ['Deportes', 'Electrónica', 'Hogar', 'Libros', 'Ropa']
Con la misma tabla, tabla.plot(kind="bar", stacked=True) apila las categorías en cada mes y tabla.plot(subplots=True, layout=(3, 2)) da un panel por categoría. Electrónica va de 298 mil en febrero a 833 mil en diciembre; Libros, de 18 a 59 mil. En una sola escala, Libros queda casi plano: los paneles separados ayudan a ver su forma.
4. Series de tiempo: resample
Con la fecha como índice, resample agrupa por periodos de calendario. El total semanal ("W", semanas que cierran en domingo) tiene 53 puntos; el máximo es la semana que cierra el 21 de diciembre, con 377.4 mil MXN.
serie = ventas.set_index("fecha")["total"]
semanal = serie.resample("W").sum()
print(len(semanal)) # 53
print(semanal.idxmax().date()) # 2025-12-21
fig, ax = plt.subplots()
semanal.plot(ax=ax)
mensual_fin = serie.resample("ME").sum() # fin de mes
print(len(mensual_fin)) # 12
En pandas 3 el alias de fin de mes es "ME"; el antiguo "M" lanza un ValueError. La primera semana cierra el 5 de enero y la última el 4 de enero de 2026: por eso son 53 y no 52.
5. El argumento ax= y cuándo bajar a Matplotlib
ax= es lo que integra pandas con el resto del curso: dibuja en un panel que ya existe, por ejemplo uno de una cuadrícula de plt.subplots(2, 2) o de un dashboard. Sin ax=, Series.plot dibuja sobre los ejes «actuales» de pyplot, que pueden ser los del gráfico anterior. Por eso en el curso siempre se crea el panel primero.
pandas basta para exploración rápida: una línea por columna, barras de un groupby, un histograma. Conviene bajar a Matplotlib puro cuando necesitas barras agrupadas con control de ancho, burbujas con tamaño y color por variable, un donut con texto al centro o anotaciones precisas. Las dos cosas se mezclan sin problema: dibuja con pandas y termina con ax.set_*, ax.annotate o un formateador.
Trampas comunes
- Olvidar
ax=. La serie nueva cae sobre el gráfico anterior y mezcla barras con un histograma. - Tabla en forma larga.
DataFrame.plotespera una columna por serie; usapivot_tableounstackantes. - Índice desordenado. Una línea con el índice sin ordenar zigzaguea; ordena con
sort_index(). - Alias viejos de frecuencia.
"M"ya no funciona en pandas 3; usa"ME". - Etiqueta automática. El eje x hereda el nombre del índice («fecha» aunque sean meses).
Cierre
El notebook pandas-y-avanzados usa pandas para preparar y dibujar, y Matplotlib para la dispersión de precio contra unidades, las burbujas por región y categoría y el pastel y el donut del ingreso. La regla práctica: pandas para la forma de la tabla y el primer gráfico, Matplotlib para el detalle final.