Matplotlib y Seaborn son las dos bibliotecas más usadas en Python para convertir datos en gráficas claras y profesionales.
Con ellas puedes crear desde un histograma básico hasta una gráfica de dispersión con múltiples variables. En esta lección aprenderás qué tipo de gráfica usar en cada situación y cómo construirla paso a paso.
Preparar el entorno
Antes de graficar, instala e importa las bibliotecas necesarias. Ejecuta esto una sola vez en tu entorno:
# Instalación (solo si no las tienes)
# pip install matplotlib seaborn
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
matplotlib.pyplot es el motor base de las gráficas. seaborn se construye sobre Matplotlib y produce gráficas más estéticas con menos código.
Crea un DataFrame de ejemplo con ventas mensuales de una empresa mexicana:
data = {
"mes": ["Ene", "Feb", "Mar", "Abr", "May", "Jun"],
"ventas_liverpool": [320000, 295000, 410000, 380000, 450000, 500000],
"ventas_bimbo": [180000, 175000, 210000, 195000, 220000, 240000],
"region": ["Norte", "Norte", "Centro", "Centro", "Sur", "Sur"]
}
df = pd.DataFrame(data)
Gráfica de barras: comparar categorías
Usa una gráfica de barras cuando quieras comparar valores entre categorías distintas. Por ejemplo: ventas por sucursal, productos por región, o empleados por departamento.
Cuándo usarla: cuando el eje X tiene etiquetas de texto (meses, nombres, regiones).
plt.figure(figsize=(8, 5))
plt.bar(df["mes"], df["ventas_liverpool"], color="steelblue")
plt.title("Ventas mensuales — Liverpool")
plt.xlabel("Mes")
plt.ylabel("Ventas ($)")
plt.tight_layout()
plt.show()
Resultado esperado: seis barras verticales, una por mes, con alturas proporcionales a las ventas.
Con Seaborn el mismo resultado requiere menos configuración manual:
sns.barplot(data=df, x="mes", y="ventas_liverpool", color="steelblue")
plt.title("Ventas mensuales — Liverpool (Seaborn)")
plt.show()
Ventaja de Seaborn: agrega automáticamente barras de error si hay datos repetidos por categoría.
Gráfica de líneas: mostrar tendencias en el tiempo
Usa una gráfica de líneas para mostrar cómo cambia una variable a lo largo del tiempo. Es ideal para series temporales: ventas diarias, precios históricos, o producción semanal.
Cuándo usarla: cuando el eje X representa tiempo y el orden de los puntos importa.
plt.figure(figsize=(8, 5))
plt.plot(df["mes"], df["ventas_liverpool"], marker="o", label="Liverpool", color="steelblue")
plt.plot(df["mes"], df["ventas_bimbo"], marker="s", label="Bimbo", color="orange")
plt.title("Tendencia de ventas — Primer semestre")
plt.xlabel("Mes")
plt.ylabel("Ventas ($)")
plt.legend()
plt.tight_layout()
plt.show()
El parámetro marker agrega un símbolo en cada punto de dato. Esto facilita leer valores exactos en la gráfica.
Con Seaborn puedes usar sns.lineplot() y obtener el intervalo de confianza sombreado de forma automática:
sns.lineplot(data=df, x="mes", y="ventas_liverpool", marker="o")
plt.title("Tendencia Liverpool — Seaborn")
plt.show()
Histograma: entender la distribución de valores
Un histograma muestra cuántas veces aparecen valores dentro de rangos (llamados bins). No compara categorías; analiza la distribución de una variable numérica.
Cuándo usarlo: para responder preguntas como "¿cuántos empleados ganan entre $15,000 y $20,000?".
Crea datos de salarios para este ejemplo:
import numpy as np
np.random.seed(42)
salarios = np.random.normal(loc=18500, scale=4000, size=200)
df_sal = pd.DataFrame({"salario": salarios})
plt.figure(figsize=(8, 5))
plt.hist(df_sal["salario"], bins=15, color="teal", edgecolor="white")
plt.title("Distribución de salarios — Empresa FEMSA")
plt.xlabel("Salario ($)")
plt.ylabel("Número de empleados")
plt.tight_layout()
plt.show()
Con Seaborn puedes agregar una curva de densidad encima del histograma:
sns.histplot(df_sal["salario"], bins=15, kde=True, color="teal")
plt.title("Distribución de salarios con curva KDE")
plt.xlabel("Salario ($)")
plt.show()
El parámetro kde=True dibuja una curva suavizada que muestra la forma de la distribución.
Interpretación rápida: si la curva es simétrica, los salarios están bien distribuidos alrededor de la media ($18,500). Si está sesgada a la derecha, hay pocos empleados con salarios muy altos que jalan el promedio hacia arriba.
Gráfica de dispersión: detectar relaciones entre variables
Una gráfica de dispersión (scatter plot) muestra la relación entre dos variables numéricas. Cada punto es una observación.
Cuándo usarla: para detectar correlaciones, grupos o valores atípicos (outliers).
Crea un DataFrame con datos de productos de Mercado Libre:
np.random.seed(7)
df_ml = pd.DataFrame({
"precio": np.random.randint(100, 5000, 80),
"resenias": np.random.randint(0, 500, 80),
"categoria": np.random.choice(["Electrónica", "Ropa", "Hogar"], 80)
})
plt.figure(figsize=(8, 5))
plt.scatter(df_ml["precio"], df_ml["resenias"], alpha=0.6, color="coral")
plt.title("Precio vs Reseñas — Productos Mercado Libre")
plt.xlabel("Precio ($)")
plt.ylabel("Número de reseñas")
plt.tight_layout()
plt.show()
Con Seaborn puedes colorear cada punto según una variable categórica:
sns.scatterplot(data=df_ml, x="precio", y="resenias", hue="categoria", alpha=0.7)
plt.title("Precio vs Reseñas por categoría")
plt.show()
El parámetro hue asigna un color distinto a cada categoría. Esto te permite ver de inmediato si un grupo se comporta diferente.
Tabla de referencia: ¿qué gráfica usar?
| Tipo de gráfica | Caso de uso principal | Función Matplotlib | Función Seaborn |
|---|---|---|---|
| Barras | Comparar categorías | plt.bar() |
sns.barplot() |
| Líneas | Tendencias en el tiempo | plt.plot() |
sns.lineplot() |
| Histograma | Distribución de una variable numérica | plt.hist() |
sns.histplot() |
| Dispersión | Relación entre dos variables numéricas | plt.scatter() |
sns.scatterplot() |
Personalizar tus gráficas
Una gráfica bien etiquetada comunica más que una gráfica bonita sin contexto. Usa siempre estos elementos:
plt.title()— título descriptivo que explica qué muestra la gráficaplt.xlabel()/plt.ylabel()— etiquetas en los ejes con unidadesplt.legend()— leyenda cuando tienes más de una serieplt.tight_layout()— evita que los elementos se encimen
Para cambiar el estilo visual de todas las gráficas en un notebook, aplica un tema de Seaborn al inicio:
sns.set_theme(style="whitegrid")
Esto afecta tanto las gráficas de Seaborn como las de Matplotlib puro.
Errores comunes
1. No llamar plt.show()
En algunos entornos la gráfica no se despliega si omites esta línea. Agrégala siempre al final de cada bloque de graficación.
2. Confundir histograma con gráfica de barras
Un histograma agrupa valores numéricos continuos. Una gráfica de barras compara categorías separadas. Si usas plt.bar() para graficar una distribución de salarios, el resultado no tiene sentido estadístico.
3. No ajustar el tamaño de la figura
Si omites plt.figure(figsize=(ancho, alto)), Matplotlib usa un tamaño predeterminado pequeño. Para dashboards o reportes, define el tamaño explícitamente desde el principio.
4. Superponer gráficas sin limpiar el canvas
Si ejecutas dos bloques de código en celdas separadas sin plt.figure(), Matplotlib puede dibujar ambas gráficas en el mismo lienzo. Abre siempre una figura nueva con plt.figure() antes de cada gráfica independiente.
5. Olvidar hue cuando tienes categorías
Graficar todos los puntos del mismo color cuando tienes categorías (como "Electrónica", "Ropa", "Hogar") oculta patrones importantes. Usa hue en Seaborn para separar grupos visualmente.
Exportar tu gráfica
Para guardar cualquier gráfica como imagen, usa plt.savefig() antes de plt.show():
plt.savefig("ventas_liverpool.png", dpi=150, bbox_inches="tight")
plt.show()
El parámetro dpi=150 define la resolución. Para presentaciones usa dpi=150; para impresión usa dpi=300.