Ya sabes cargar y limpiar datos. Pero una tabla de 500 filas no convence a nadie en una reunión. Aquí aprendes a mirarlos y a hacer que otros los entiendan en cinco segundos.
Librerías
con qué se dibuja
Anatomía
figura y ejes
matplotlib
barras e histograma
seaborn
caja y dispersión
Cuál elegir
9 gráficos, 9 preguntas
Que se entienda
títulos y color
Guardar
savefig y resolución
Tablero
varios en una figura
Plantilla
para reutilizar
barras
líneas
histograma
caja
dispersión
calor
En Python hay decenas de librerías para graficar. En la práctica, el 95% del trabajo profesional sale de estas tres, y conviene saber para qué sirve cada una antes de escribir la primera línea.
Es el motor: seaborn y pandas dibujan encima de ella. Da el control fino —cada color, cada etiqueta, cada margen— y es la que guarda el archivo para el informe.
Si solo aprendes una, que sea esta.
Habla DataFrame: le pasas el df y los nombres de las columnas y él agrupa, calcula la estadística y pone la leyenda. Lo que en matplotlib son diez líneas, aquí es una.
Para explorar rápido y para gráficos estadísticos.
Produce gráficos que se tocan: zoom, valores al pasar el cursor y filtros. No sirve para un PDF, pero es lo que va dentro de un tablero web — el Módulo 4.
Lo retomamos al construir el panel.
Ninguna es obligatoria. Se aprenden cuando aparece el problema que las pide, no antes.
Una figura es el lienzo; unos ejes son el gráfico que va dentro. Entender esos dos objetos evita casi toda la frustración con matplotlib.
1 Las piezas · pasa el cursor por cada nombre
La figura es el lienzo —el tamaño, el fondo y lo que se guarda al exportar—.
Los ejes son el gráfico que va dentro: las barras, los rótulos, el título.
Casi todo se le pide a ax.
import matplotlib.pyplot as plt # 1 · lienzo y ejes fig, ax = plt.subplots(figsize=(8, 4)) # 2 · dibujar ax.bar(datos.index, datos.values) # 3 · explicar ax.set_title("Ventas por categoría") ax.set_xlabel("Categoría") ax.set_ylabel("Millones COP") # 4 · ajustar y mostrar plt.tight_layout() plt.show()
Un gráfico sin títulos de eje no es un gráfico: es un dibujo.
plt.bar(...) y ax.bar(...). Usa el de ax: es el único que funciona cuando pones varias gráficas juntas.
Con tres tipos cubres casi todo: barras para comparar, líneas para el tiempo e histograma para ver cómo se reparten los valores.
1 Barras · comparar categorías
g = (df.groupby("categoria_producto")["ventas_cop"]
.sum().sort_values() / 1e6)
fig, ax = plt.subplots(figsize=(8, 4))
ax.barh(g.index, g.values, color="#c8f25a")
ax.set_xlabel("millones COP")
2 Histograma · ver la distribución
fig, ax = plt.subplots(figsize=(8, 4))
ax.hist(df["unidades"], bins=30, color="#00f5d4")
ax.set_xlabel("unidades por venta")
ax.set_ylabel("frecuencia")
plt.style.use(...), no parte del código.
seaborn se apoya en matplotlib pero entiende los DataFrame: le pasas el df y los nombres de las columnas, y calcula el resto.
1 Caja · comparar distribuciones
import seaborn as sns
fig, ax = plt.subplots(figsize=(8, 4))
sns.boxplot(data=df, x="canal_venta",
y="margen_pct", ax=ax)
2 Dispersión · relacionar dos variables
sns.scatterplot(data=df, x="unidades",
y="ventas_cop",
hue="segmento_cliente", ax=ax)
hue= es el argumento más rentable de seaborn: parte cualquier gráfico por una columna categórica y le pone la leyenda solo.
No se elige por bonito, sino por lo que quieres que la audiencia responda al mirarlo. Pasa el cursor por cada pregunta; donde haya dos insignias, púlsalas para cambiar el gráfico.
¿Cuál es más grande?
ax.bar() · ax.pie()
Ordénalas por valor, no alfabéticamente. Cambia a torta y verás lo que cuesta comparar porciones.
¿Cómo cambia en el tiempo?
ax.plot(fecha, valor)
Solo si el eje X es tiempo. Para categorías, una línea no significa nada.
¿Cómo se reparten?
ax.hist() · sns.boxplot()
Histograma para una variable; caja para comparar esa variable entre grupos.
¿Se relacionan?
sns.scatterplot() · sns.heatmap()
Dispersión para dos variables; mapa de calor para ver todas las correlaciones de golpe.
El gráfico de torta, casi nunca
El ojo humano compara mal los ángulos. Pruébalo aquí arriba: cambia de barras a torta y mira lo que cuesta ordenar las porciones. Resérvala para "una parte frente al total".
La prueba de los cinco segundos
Enseña la gráfica cinco segundos y pregunta qué entendieron. Si dudan, el problema es la gráfica, no la persona.
Con los cuatro anteriores resuelves el día a día. Estos cinco aparecen cuando la pregunta se vuelve concreta: rarezas, incertidumbre, varios criterios a la vez, flujos y optimización.
¿Hay datos atípicos?
sns.boxplot(showfliers=True)
Cada punto suelto es una venta fuera de lo normal. Revísala antes de promediar: puede ser un error de captura o el mejor cliente del año.
¿La diferencia es real o es ruido?
ax.errorbar(x, media, yerr=ic)
La media sola engaña. Si los intervalos se solapan, no puedes afirmar que un grupo sea mayor que otro.
¿Quién gana en varios criterios?
plt.subplot(polar=True) · px.line_polar()
Compara dos o tres perfiles en 5 o 6 ejes. Todos los ejes en la misma escala; con más de siete, se vuelve un garabato.
¿Por dónde se mueve el flujo?
go.Sankey() · plotly
De dónde viene y a dónde va: el grosor de la banda es la cantidad. Para embudos, conversiones y reparto de presupuesto.
¿Qué combinación da el mejor resultado?
ax.contourf(X, Y, Z) · go.Surface()
Dos variables que puedes ajustar y un resultado que quieres maximizar: el mapa enseña dónde está el óptimo.
Con qué se hace cada uno
Las barras de error, la caja con atípicos y la telaraña salen de matplotlib y seaborn. El Sankey y la superficie que se puede girar son terreno de plotly — la librería del Módulo 4.
No los uses por lucirte
Un gráfico raro obliga a la audiencia a aprender a leerlo antes de entender el dato. Solo vale la pena cuando unas barras de verdad no responden la pregunta.
La misma gráfica, los mismos datos. Cinco arreglos de una línea cada uno la convierten en algo que se entiende sin que tú estés al lado explicando. Míralos ocurrir.
set_xlabel("millones COP")..sort_values().# 3 · ordenar por valor g = g.sort_values() # 4 · gris para todas y color solo para la mayor colores = ["#33415c"] * len(g) colores[-1] = "#c8f25a" ax.barh(g.index, g.values, color=colores) # 1 y 2 · título que afirma y unidades ax.set_title("Tecnología concentra el 37% de las ventas") ax.set_xlabel("millones COP") # 5 · quitar los bordes que no aportan for lado in ["top", "right"]: ax.spines[lado].set_visible(False)
plt.show() la muestra y la descarta. Para que quede un archivo hay que pedirlo — y antes de show(), no después.
1 El orden · la misma figura por dos caminos
savefig()
ventas.png con la gráfica
show() la muestra y la vacía
savefig()
ventas.png en blanco
Guardar va primero. show() entrega la figura a la ventana del visor y la deja vacía: lo que se guarde después ya no tiene nada dentro.
2 La resolución · la misma gráfica, dos valores de dpi
dpi es la resolución: 300 para imprimir, 150 basta para pantalla · bbox_inches recorta el margen sobrante · transparent quita el fondo blanco.
from pathlib import Path
SALIDA = Path(__file__).parent / "graficas"
SALIDA.mkdir(exist_ok=True)
fig.savefig(SALIDA / "ventas_categoria.png",
dpi=300, bbox_inches="tight")
plt.show() # después de guardar
.png para pegar en documentos. .svg si necesitas ampliarla sin que se pixele: no guarda píxeles, guarda las instrucciones para dibujarla.
Un tablero no es más que varios ejes dentro de una misma figura. plt.subplots(filas, columnas) devuelve una rejilla y dibujas en cada casilla, nombrándola por su fila y su columna.
fig, axes = plt.subplots(3, 2, figsize=(12, 11))
axes[0, 0].barh(g.index, g.values, color="#c8f25a")
axes[0, 0].set_title("Ventas por categoría")
axes[0, 1].hist(df["unidades"], bins=30)
axes[0, 1].set_title("Distribución de unidades")
sns.boxplot(data=df, x="canal_venta", y="margen_pct",
ax=axes[1, 0])
axes[1, 0].set_title("Margen por canal")
sns.scatterplot(data=df, x="unidades", y="ventas_cop",
ax=axes[1, 1])
axes[1, 1].set_title("Unidades y ventas")
axes[2, 0].plot(mes.index, mes.values)
axes[2, 0].set_title("Ventas mes a mes")
axes[2, 1].errorbar(ic.index, ic["media"], yerr=ic["err"], fmt="o")
axes[2, 1].set_title("Margen medio y su intervalo")
fig.suptitle("Panel de ventas 2025", fontsize=16)
plt.tight_layout()
suptitle titula toda la figura; tight_layout evita que los títulos se pisen.
2 Así queda · plt.subplots(3, 2) = una figura con seis casillas
Primero la fila, después la columna, y las dos empiezan en cero — como los índices de las listas.
El mismo esqueleto sirve para cualquier gráfico: cambias la línea que dibuja y los textos. El resto se queda igual.
1 Preparar
from pathlib import Path import pandas as pd import matplotlib.pyplot as plt import seaborn as sns BASE = Path(__file__).parent SALIDA = BASE / "graficas" SALIDA.mkdir(exist_ok=True) df = pd.read_csv(BASE / "datos" / "ventas_empresa.csv") # ── 1 · el dato que se va a dibujar ── g = (df.groupby("categoria_producto")["ventas_cop"] .sum().sort_values() / 1e6) # ── 2 · lienzo ── fig, ax = plt.subplots(figsize=(9, 5))
2 Dibujar, explicar y guardar
# ── 3 · dibujar (la única línea que cambias) ── colores = ["#33415c"] * len(g) colores[-1] = "#c8f25a" ax.barh(g.index, g.values, color=colores) # ── 4 · explicar ── ax.set_title("Tecnología lidera las ventas de 2025") ax.set_xlabel("millones COP") ax.set_ylabel("") for lado in ["top", "right"]: ax.spines[lado].set_visible(False) # ── 5 · guardar y mostrar ── plt.tight_layout() fig.savefig(SALIDA / "ventas.png", dpi=300, bbox_inches="tight") plt.show()
Vamos a iniciar con la práctica. A continuación encontrarás el catálogo de prompts para generar distintos tipos de gráficos interactivos usando Inteligencia Artificial.
Para probar los siguientes prompts, necesitas descargar el archivo de Excel con los datos de producción simulados.
Descargar Archivo ExcelUtiliza la flecha de la derecha para continuar y ver el primer prompt
• Eje Horizontal (X): Planta
• Eje Vertical (Y): Unidades_Producidas
• Color de barras: Linea_Produccion
💡 ¿Para qué sirve? Para ver de un vistazo qué fábrica o producto tiene la mayor cantidad producida.
Crea un GRÁFICO DE BARRAS en Python (usando Seaborn o Plotly) para comparar la producción con 'datos_produccion_10000.xlsx':
- En el eje X coloca la columna 'Planta'.
- En el eje Y coloca la suma de 'Unidades_Producidas'.
- Usa la columna 'Linea_Produccion' para separar las barras por colores.
- Agrega un título claro: "Producción Total por Planta y Línea".
- Muestra los números encima de cada barra para que sea fácil de leer.
- Guarda el gráfico generado como un archivo .png de alta resolución.
Por favor, dame el código en Python bien comentado y explicado paso a paso para principiantes.
• Categoría (Porciones): Estado_Lote
• Valores: Porcentaje (%) de Aprobados, Retrabajo y Rechazados
💡 ¿Para qué sirve? Para entender qué porción del total representa cada categoría.
Crea un gráfico de DONUT (gráfico circular con un hueco en el centro) en Python con 'datos_produccion_10000.xlsx':
- Utiliza la columna 'Estado_Lote' (Aprobado, Requiere Retrabajo, Rechazado).
- Muestra el porcentaje (%) de cada parte de forma clara y visible.
- Usa colores intuitivos: Verde para Aprobado, Amarillo/Naranja para Retrabajo y Rojo para Rechazado.
- Agrega un título llamativo: "Distribución del Estado de los Lotes".
- Guarda el gráfico generado como un archivo .png de alta resolución.
Explícame el código línea por línea para entender cómo funciona.
• Variable Numérica: Tasa_Defectos_Pct
• Agrupación: Barras continuas (Intervalos / Bins)
💡 ¿Para qué sirve? Para ver qué valores numéricos son los más comunes y cómo se agrupan los datos.
Crea un HISTOGRAMA en Python con el archivo 'datos_produccion_10000.xlsx':
- Utiliza la columna numérica 'Tasa_Defectos_Pct'.
- Divide los datos en unas 30 barras para ver cómo se agrupan.
- Pinta las barras de color azul claro con bordes bien definidos.
- Ponle nombres claros a los ejes: "Porcentaje de Defectos" en el eje X y "Cantidad de Lotes" en el eje Y.
- Agrega un título que diga "Distribución del Porcentaje de Defectos".
- Guarda el gráfico generado como un archivo .png de alta resolución.
Explícame de forma sencilla qué nos muestra este gráfico y cómo se lee.
• Eje Horizontal (X): Anio_Mes (Tiempo)
• Eje Vertical (Y): Margen_Ganancia_USD
💡 ¿Para qué sirve? Para ver si los resultados están mejorando o empeorando con el paso de los meses.
Crea un GRÁFICO DE LÍNEAS en Python con 'datos_produccion_10000.xlsx' para ver cómo evolucionan las ganancias:
- En el eje X coloca la columna de fecha o mes 'Anio_Mes'.
- En el eje Y coloca la suma de 'Margen_Ganancia_USD'.
- Dibuja una línea verde con puntos marcadores en cada mes.
- Agrega una cuadrícula de fondo suave para que sea fácil seguir los valores.
- Título: "Evolución de Ganancias Mensuales".
- Guarda el gráfico generado como un archivo .png de alta resolución.
Dame el código en Python con comentarios sencillos para principiantes.
• Eje Horizontal (X): Linea_Produccion
• Eje Vertical (Y): Horas_Mantenimiento_Previo
💡 ¿Para qué sirve? La caja muestra la mayoría de los datos y los puntos rojos son los valores raros o atípicos.
Crea un DIAGRAMA DE CAJA (Boxplot) en Python con 'datos_produccion_10000.xlsx':
- En el eje X coloca 'Linea_Produccion'.
- En el eje Y coloca 'Horas_Mantenimiento_Previo'.
- Quiero que se vean las cajas y que los puntos atípicos (los que se salen de lo común) se pinten de color rojo para que resalten.
- Agrega un título claro: "Horas de Mantenimiento y Detección de Casos Atípicos por Línea".
- Guarda el gráfico generado como un archivo .png de alta resolución.
Explícame de forma muy sencilla qué significa la caja y qué representan los puntos rojos que quedan afuera.
• Eje Horizontal (X): Turno
• Eje Vertical (Y): Temperatura_Horno_C
💡 ¿Para qué sirve? Las partes más anchas del violín muestran dónde se concentran más datos.
Crea un DIAGRAMA DE VIOLÍN en Python con 'datos_produccion_10000.xlsx':
- En el eje X coloca la columna 'Turno' (Mañana, Tarde, Noche).
- En el eje Y coloca 'Temperatura_Horno_C'.
- Usa un color diferente para cada turno.
- Dibuja la silueta suave para ver en qué partes es más ancha la figura.
- Título: "Distribución de Temperatura según el Turno".
- Guarda el gráfico generado como un archivo .png de alta resolución.
Explícame de forma sencilla por qué se llama diagrama de violín y cómo se interpreta.
• Eje Horizontal (X): Horas_Mantenimiento_Previo
• Eje Vertical (Y): Tasa_Defectos_Pct
💡 ¿Para qué sirve? Para ver si cuando una variable sube, la otra también sube o baja.
Crea un GRÁFICO DE DISPERSIÓN (Scatter Plot) en Python con 'datos_produccion_10000.xlsx' para comparar dos variables numéricas:
- En el eje X coloca 'Horas_Mantenimiento_Previo'.
- En el eje Y coloca 'Tasa_Defectos_Pct'.
- Dibuja los puntos pequeños y con algo de transparencia para que se distingan bien.
- Agrega una línea de tendencia en color rojo para ver hacia dónde se inclinan los datos.
- Título: "Relación entre Horas sin Mantenimiento y Porcentaje de Defectos".
- Guarda el gráfico generado como un archivo .png de alta resolución.
Explícame de forma sencilla si el gráfico muestra que a más horas de mantenimiento hay más o menos defectos.
• Eje X: Consumo_Energia_kWh
• Eje Y: Unidades_Producidas
• Color: Linea_Produccion
• Tamaño de círculo: Costo_Total_USD
💡 ¿Para qué sirve? Permite ver 4 cosas a la vez en una sola imagen (posición X, Y, color y tamaño).
Crea un GRÁFICO DE DISPERSIÓN CON COLORES Y TAMAÑOS (Burbujas) en Python con 'datos_produccion_10000.xlsx':
- Eje X: 'Consumo_Energia_kWh'.
- Eje Y: 'Unidades_Producidas'.
- Color de los puntos: Diferencia los puntos según la columna 'Linea_Produccion'.
- Tamaño de los puntos: Que los círculos sean más grandes si el 'Costo_Total_USD' es mayor.
- Agrega una leyenda clara para identificar qué significa cada color.
- Título: "Producción vs Energía por Línea de Fabricación".
- Guarda el gráfico generado como un archivo .png de alta resolución.
Explícame paso a paso cómo interpretar los puntos grandes vs los pequeños.
• Columnas numéricas: Antigüedad, Mantenimiento, Defectos, Energía, Ganancia.
💡 ¿Para qué sirve? Los colores intensos indican que dos variables están fuertemente relacionadas.
Crea un MAPA DE CALOR (Heatmap) en Python usando el archivo 'datos_produccion_10000.xlsx':
- Selecciona estas columnas numéricas: 'Antiguedad_Maquina_Anios', 'Horas_Mantenimiento_Previo', 'Tasa_Defectos_Pct', 'Consumo_Energia_kWh', 'Margen_Ganancia_USD'.
- Calcula cómo se relacionan entre sí y muéstralo en una cuadrícula con colores.
- Escribe los números dentro de cada recuadro para ver el valor exacto.
- Usa colores atractivos (por ejemplo, tonos cálidos para relaciones positivas y fríos para negativas).
- Título: "Mapa de Calor: Relación entre Variables".
- Guarda el gráfico generado como un archivo .png de alta resolución.
Explícame de forma muy sencilla cómo saber qué variables tienen mayor relación según el color.
• Grupos: 4 Linea_Produccion
• Ejes: Producción, Energía, Mantenimiento, Experiencia, Ganancia
💡 ¿Para qué sirve? Como en los videojuegos, compara el perfil completo de cada grupo en varias características a la vez.
Crea un GRÁFICO DE TELARAÑA O RADAR (Spider Chart) en Python con el archivo 'datos_produccion_10000.xlsx':
- Quiero comparar las 4 'Linea_Produccion' (Automotriz, Electrónica, Empaques, Metalmecánica).
- En los ejes radiales evalúa los promedios de: Unidades Producidas, Consumo de Energía, Horas de Mantenimiento, Experiencia del Operario y Margen de Ganancia.
- Dibuja la figura de cada línea con un color diferente y un relleno suave transparente.
- Título: "Comparativa General de las Líneas de Producción".
- Guarda el gráfico generado como un archivo .png de alta resolución.
Dame el código en Python (usando Plotly) y explícame de forma sencilla cómo se lee la figura de telaraña.
• 1. Planta → 2. Linea_Produccion → 3. Estado_Lote
💡 ¿Para qué sirve? Las bandas más gruesas indican mayor cantidad de unidades que viajan de una etapa a otra.
Crea un DIAGRAMA DE FLUJO SANKEY en Python usando Plotly y el archivo 'datos_produccion_10000.xlsx':
- Muestra el camino que sigue la producción:
1. Desde la 'Planta' de origen.
2. Hacia la 'Linea_Produccion'.
3. Y finalmente hacia el 'Estado_Lote' (Aprobado, Retrabajo, Rechazado).
- Que el grosor de cada banda represente la cantidad de 'Unidades_Producidas'.
- Usa colores atractivos para que sea muy visual e interactivo.
- Título: "Flujo de Producción desde la Planta hasta el Estado Final".
- Guarda el gráfico generado como un archivo .png de alta resolución.
Dame el código en Python bien estructurado y explícame de forma sencilla cómo funciona este diagrama de flujo.
• Estructura: 2 filas y 3 columnas (6 gráficos en total)
• Contenido: Mezcla de líneas, barras y dispersión.
💡 ¿Para qué sirve? Para armar un mini-panel y comparar distintos comportamientos sin cambiar de ventana.
Crea una figura en Python con Subplots en un arreglo de 2 filas por 3 columnas usando 'datos_produccion_10000.xlsx'.
- Gráfico 1: Barras de 'Unidades_Producidas' por 'Planta'.
- Gráfico 2: Histograma de 'Tasa_Defectos_Pct'.
- Gráfico 3: Dispersión de 'Horas_Mantenimiento_Previo' vs 'Consumo_Energia_kWh'.
- Gráfico 4: Líneas de 'Margen_Ganancia_USD' por 'Anio_Mes'.
- Gráfico 5: Boxplot de 'Temperatura_Horno_C' por 'Turno'.
- Gráfico 6: Torta/Donut de 'Estado_Lote'.
Asegúrate de que la figura sea grande, que los gráficos no se amontonen (usa tight_layout) y ponle un título general: "Análisis General de Producción".
- Guarda la figura completa como un archivo .png de alta resolución.
• Un archivo HTML único
• Funciona sin instalar Python
• Lee los datos lógicos de tu Excel automáticamente
💡 ¿Para qué sirve? Para crear una herramienta visual completa donde el usuario final solo sube el Excel y ve los gráficos al instante.
Crea un archivo HTML de un solo documento que funcione como un Dashboard interactivo.
El HTML debe tener:
1. Un área de "Arrastrar y Soltar" (Drag & Drop) para que yo pueda cargar el archivo 'datos_produccion_10000.csv'.
2. Lógica en JavaScript (puedes usar PapaParse y Chart.js o Plotly.js) para procesar los datos lógicos que contiene este dataset (Tasa de defectos, Producción, Mantenimiento, Planta).
3. Una vez cargado el archivo, deben aparecer 4 gráficos dinámicos que resuman la operación:
- Barras: Producción total por Planta.
- Torta: Distribución del Estado del Lote.
- Dispersión: Horas de mantenimiento vs Defectos.
- Líneas: Ganancia mes a mes.
4. Un diseño moderno y oscuro (puedes usar TailwindCSS vía CDN).
El código debe estar completo y listo para guardar y abrir en el navegador.
Sabes elegir el gráfico según la pregunta, hacerlo legible y guardarlo con calidad para un informe.
Hoy dominas
matplotlib · seaborn · elegir el gráfico · savefig
Lo que sigue
convertir el tablero en una app con filtros
Al final
publicarla con un enlace que puedas compartir
Trabajo Científico · @TCientifico · Democratizando la ciencia de datos