# graficos-en-matplotlib
Gráficos en Matplotlib
Volver a la portada del cursoProyecto Final: Visualización Completa
Sección 6 · Proyecto Final
Proyecto final: el dashboard de ventas 2025 de PyShop
Durante el curso cada lección agregó una pieza: líneas, barras, ejes honestos, colores, dispersión, donut, pandas y exportación. En este proyecto se unen todas en un solo producto: el tablero de ventas 2025 de PyShop, una figura de una página que la dirección pueda leer en un minuto, exportada a PNG y PDF, y un informe breve con tres hallazgos. Se usan Python 3.11 o superior, matplotlib y pandas. El notebook proyecto-dashboard contiene una solución de referencia completa: consúltalo al terminar, no antes.
Contexto
La dirección de PyShop prepara el plan de 2026 y necesita ver el año anterior en una sola hoja: cuánto se vendió, cuándo, qué y dónde, y por qué canal. No quiere veinte gráficos sueltos, sino un tablero con indicadores clave arriba y paneles que respondan una pregunta cada uno.
Datos
La función generar_ventas(n=6000, semilla=42) produce los 6000 pedidos de 2025, siempre iguales. Está en la primera celda de código de cualquier notebook del curso; cópiala al inicio del tuyo. Columnas: fecha, categoria, region, canal, precio, unidades, calificacion y total.
import matplotlib.pyplot as plt
ventas = generar_ventas()
print(len(ventas)) # 6000
print(round(ventas["total"].sum(), 2)) # 10932695.87
Requisitos mínimos
- Una sola figura creada con
plt.subplot_mosaicoplt.subplotsylayout="constrained", con un título general (fig.suptitle). - Fila de KPIs: ingreso total, pedidos, ticket medio y calificación media, como tarjetas (
ax.axis("off")yax.text). - Al menos cinco paneles de datos, cada uno respondiendo una pregunta distinta. Deben aparecer al menos: una tendencia (línea mensual), un ranking (barras ordenadas), una composición (donut o barras apiladas al 100 %) y una relación (dispersión).
- Ejes honestos: barras desde cero, nombres de mes en el eje x, unidades en títulos o etiquetas y formato legible de los montos (por ejemplo «1.5 M» con un formateador).
- Estilo consistente: una paleta de pocos colores, un color de resalte para lo importante y gris para el contexto; sin bordes superior y derecho donde no aporten.
- Una función por panel que reciba un
Axesy un DataFrame, y una funcióndashboard(df, titulo)que arme la figura completa. - Exportación: el tablero en PNG a 300 dpi y en PDF. Comprueba el tamaño del PNG en píxeles.
Cifras esperadas
Tu tablero debe mostrar estos valores:
- KPIs: ingreso 10.93 M MXN, 6000 pedidos, ticket medio 1,822.12 MXN y calificación media 4.14.
- Ingreso mensual: mínimo en febrero (0.61 M) y máximo en diciembre (1.50 M).
- Trimestres: 2.27, 2.38, 2.55 y 3.73 M; el cuarto trimestre es el 34.1 % del año.
- Categorías: Electrónica 6.10, Hogar 1.81, Deportes 1.40, Ropa 1.26 y Libros 0.36 M.
- Regiones: Centro 4.22, Norte 2.51, Occidente 2.46 y Sur 1.74 M.
- Canales: Web 44.2 %, App 37.3 % y Marketplace 18.5 %.
- Correlación entre pedidos e ingreso diarios: 0.787.
Si una cifra no coincide, el error casi siempre está en la agrupación: revisa la columna del groupby y si dividiste entre un millón.
Pistas de implementación
En subplot_mosaic cada fila es una lista de nombres; un nombre repetido ocupa varias celdas. El resultado es un diccionario de paneles:
MOSAICO = [
["k1", "k2", "k3", "k4"],
["mes", "mes", "mes", "trim"],
["cat", "cat", "reg", "canal"],
["disp", "disp", "disp", "disp"],
]
fig, axd = plt.subplot_mosaic(
MOSAICO, figsize=(16, 13), layout="constrained",
height_ratios=[0.45, 1, 1, 0.9])
axd["mes"].set_title("Ingreso mensual", loc="left")
Un formateador evita dividir a mano en cada panel:
from matplotlib.ticker import FuncFormatter
def millones(v, pos):
return f"{v / 1e6:.1f} M"
ax.yaxis.set_major_formatter(FuncFormatter(millones))
Para la exportación, 16 × 13 pulgadas a 300 dpi dan 4800 × 3900 píxeles. Si usas bbox_inches="tight", el tamaño cambia porque se recortan los márgenes.
Informe breve
Acompaña el tablero con un texto de media página para la dirección: tres hallazgos, cada uno con una cifra y el panel que lo respalda, y una línea sobre lo que los datos no muestran. Ejemplo de formato: «El cuarto trimestre aporta el 34.1 % del ingreso (panel Trimestres)». Ten en cuenta que el día de la semana no tiene patrón en estos datos y que las calificaciones por categoría son casi iguales (4.09 a 4.17): no inventes una explicación.
Extras opcionales
- Versión por región: llama a
dashboardcon el DataFrame filtrado de una región y exporta un PNG por región. - Estilo oscuro: genera una versión dentro de
plt.style.context("dark_background")que conserve la legibilidad. - Anotaciones: señala el máximo mensual con
annotate. - Burbujas: agrega un panel región × categoría con tamaño proporcional al ingreso.
Entregables
- Un notebook que corra de principio a fin sin errores: datos, cifras de control, funciones de panel, tablero, exportación e informe.
- Dos archivos:
dashboard_2025.png(300 dpi) ydashboard_2025.pdf. - El informe breve con tres hallazgos, en una celda de texto del notebook o en un documento aparte.
Rúbrica (100 puntos)
- Datos y cifras (20 puntos): agrupaciones correctas y cifras esperadas en el tablero.
- Elección de gráficos (20 puntos): cada panel responde una pregunta con el tipo adecuado.
- Ejes y legibilidad (20 puntos): barras desde cero, etiquetas, unidades y formato de montos.
- Diseño del tablero (15 puntos): mosaico ordenado, KPIs arriba, paleta consistente y sin elementos encimados.
- Código reutilizable (10 puntos): funciones por panel y
dashboard(df, titulo). - Exportación (5 puntos): PNG a 300 dpi y PDF verificados.
- Informe (10 puntos): tres hallazgos con cifras y una limitación de los datos.
Los extras suman hasta 10 puntos adicionales y no sustituyen a los requisitos mínimos.