Python Matplotlib Seaborn explicado simplemente (con diagramas y código real)

Python Matplotlib Seaborn : lo esencial en un artículo — código real, diagramas y pasos concretos, extractos de un curso de 37 lecciones.

Python Matplotlib Seaborn explicado simplemente (con diagramas y código real)

Una guía que va al grano: Python Matplotlib Seaborn diseccionada con diagramas, ejemplos concretos y comandos probados. Todo proviene de un curso estructurado de 11 capítulos — aquí tienes lo mejor.

tl;dr
  • Introducción e Instalación
  • Bases de Matplotlib
  • Gráficos esenciales de Matplotlib
  • Personalización y estilos
  • Subplots y figuras complejas
~$ cat ./parcours.md # Python Matplotlib Seaborn — 10 capítulos
01
Introducción e Instalación
→ Presentación del curso→ Instalar Python, Anaconda, Jupyter y las bibliotecas+ 1 más lecciones
02
Bases de Matplotlib
→ Anatomía de una figura Matplotlib→ Pyplot vs API orientada a objetos+ 1 más lecciones
03
Gráficos esenciales de Matplotlib
→ Gráficos de líneas (line charts)→ Diagramas de barras (bar charts)+ 2 más lecciones
04
Personalización y estilos
→ Colores, marcadores y estilos de líneas→ Títulos, leyendas, anotaciones y texto+ 1 más lecciones
05
Subplots y figuras complejas
→ Subplots con plt.subplots()→ GridSpec para layouts asimétricos+ 1 más lecciones
06
Introducción a Seaborn
→ ¿Qué es Seaborn y en qué se diferencia de Matplotlib?→ Instalar Seaborn y cargar los datasets integrados+ 1 más lecciones
07
Visualizaciones estadísticas de Seaborn
→ Distribuciones con histplot, kdeplot y displot→ Boxplot, violinplot y stripplot+ 2 más lecciones
08
Visualizaciones multivariadas de Seaborn
→ pairplot y matrices de correlación→ heatmap — mapas de calor+ 1 más lecciones
🏁
Proyecto final (+ 2 capítulos en el camino)
→ Te vas con un proyecto concreto y demostrable

Exploración y visualizaciones iniciales (EDA)

NOTEObjetivo — Realizar la exploración de datos (EDA) del dataset de ventas para identificar los insights clave que destacar en el dashboard final.

¿Por qué una EDA antes del dashboard?

TIPRegla de oro — Nunca se diseña un dashboard sin haber comprendido primero los datos. La EDA revela los patrones, los outliers y los insights que deberán destacarse.

En esta lección vamos a crear 5 gráficos exploratorios para comprender:

Setup común

output
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

sns.set_theme(
    style="whitegrid",
    context="notebook",
    palette="viridis",
    font_scale=1.05,
)

df = pd.read_csv("ventes_2024.csv", parse_dates=["date"])
print(df.info())
print(df.describe())

Gráfico 1: Distribución del ticket medio

output
fig, ax = plt.subplots(figsize=(10, 5))
sns.histplot(data=df, x="vente_eur", kde=True, bins=40, color="#7c3aed", ax=ax)

mean_vente = df["vente_eur"].mean()
median_vente = df["vente_eur"].median()
ax.axvline(mean_vente, color="red", linestyle="--", linewidth=2, label=f"Media : {mean_vente:.0f} EUR")
ax.axvline(median_vente, color="orange", linestyle="--", linewidth=2, label=f"Mediana : {median_vente:.0f} EUR")

ax.set_title("Distribución del ticket medio", fontweight="bold")
ax.set_xlabel("Importe del pedido (EUR)")
ax.set_ylabel("Número de transacciones")
ax.legend()
sns.despine()
plt.tight_layout()
plt.show()
TIPInsight EDA #1 — La distribución es asimétrica a la derecha (skewed right). La media está sesgada por unos pocos pedidos muy grandes, mientras que la mediana refleja mejor el comportamiento «típico».

Gráfico 2: Evolución mensual del CA

output
monthly = df.groupby("mois").agg(
    ca=("vente_eur", "sum"),
    nb_cmd=("vente_eur", "count"),
).reset_index()

fig, ax = plt.subplots(figsize=(11, 5))
sns.lineplot(data=monthly, x="mois", y="ca", marker="o", linewidth=2.5, color="#7c3aed", ax=ax)
ax.fill_between(monthly["mois"], monthly["ca"], alpha=0.15, color="#7c3aed")

best_month = monthly.loc[monthly["ca"].idxmax()]
ax.annotate(
    f"Pico : {best_month['ca']:,.0f} EUR",
    xy=(best_month["mois"], best_month["ca"]),
    xytext=(best_month["mois"], best_month["ca"] + 1500),
    ha="center", fontsize=11, fontweight="bold", color="red",
    arrowprops=dict(arrowstyle="->", color="red")
)

ax.set_title("Evolución mensual del volumen de negocio 2024", fontweight="bold")
ax.set_xlabel("Mes"); ax.set_ylabel("CA (EUR)")
ax.set_xticks(range(1, 13))
sns.despine()
plt.tight_layout()
plt.show()
TIPInsight EDA #2 — Pico de actividad en periodo festivo (noviembre / diciembre); bajadas relativas en febrero-marzo.

Gráfico 3: Rendimiento por categoría

output
cat_perf = df.groupby("categorie").agg(
    ca=("vente_eur", "sum"),
    marge=("marge_eur", "sum"),
).reset_index().sort_values("ca", ascending=True)

fig, ax = plt.subplots(figsize=(10, 5))
y_pos = range(len(cat_perf))
ax.barh(y_pos, cat_perf["ca"], color="#a78bfa", label="CA", alpha=0.8)
ax.barh(y_pos, cat_perf["marge"], color="#7c3aed", label="Margen", alpha=0.9)

for i, (ca, marge) in enumerate(zip(cat_perf["ca"], cat_perf["marge"])):
    ax.text(ca + 2000, i, f"{ca:,.0f} EUR", va="center", fontsize=10, fontweight="bold")

ax.set_yticks(y_pos)
ax.set_yticklabels(cat_perf["categorie"])
ax.set_title("CA y márgenes por categoría de producto", fontweight="bold")
ax.set_xlabel("Importe (EUR)")
ax.legend(loc="lower right")
sns.despine()
plt.tight_layout()
plt.show()
TIPInsight EDA #3 — La electrónica y la ropa generan el mayor CA, pero su ratio margen / CA varía. El deporte, aunque genera menos CA, puede tener un margen relativo mejor.

Gráfico 4: Rendimiento por tienda (boxplot)

output
fig, ax = plt.subplots(figsize=(11, 5))
order = df.groupby("magasin")["vente_eur"].median().sort_values(ascending=False).index

sns.boxplot(data=df, x="magasin", y="vente_eur", order=order,
            palette="viridis", hue="magasin", legend=False, ax=ax)
sns.stripplot(data=df, x="magasin", y="vente_eur", order=order,
              color="black", alpha=0.15, size=2, ax=ax)

ax.set_title("Distribución de tickets por tienda (ordenado por mediana)", fontweight="bold")
ax.set_xlabel("Tienda"); ax.set_ylabel("Ticket (EUR)")
sns.despine()
plt.tight_layout()
plt.show()
TIPInsight EDA #4 — Las tiendas de París y Lyon tienen tickets medianos más altos. Burdeos muestra más outliers hacia arriba (pedidos grandes puntuales).

Gráfico 5: Correlaciones numéricas (heatmap)

output
numeric_cols = ["vente_eur", "marge_eur", "nb_articles", "mois", "trimestre"]
corr = df[numeric_cols].corr()

fig, ax = plt.subplots(figsize=(8, 6))
sns.heatmap(corr, annot=True, fmt=".2f", cmap="vlag", center=0,
            square=True, linewidths=0.5, cbar_kws={"shrink": 0.7}, ax=ax)
ax.set_title("Matriz de correlación de las variables numéricas", fontweight="bold")
plt.tight_layout()
plt.show()

Primer script de visualización

NOTEObjetivo — Crear tu primer gráfico con Matplotlib: trazar la función y = sin(x) entre 0 y 2π. Este ejercicio valida tu instalación y te da una base concreta para el resto del curso.

Objetivos pedagógicos

TIPAl finalizar este módulo — Sabrás escribir un script Python completo que genera datos con NumPy, los visualiza con Matplotlib y guarda el resultado en una imagen. También entenderás por qué siempre se empieza con import numpy as np y import matplotlib.pyplot as plt.

El script completo: 8 líneas para un primer gráfico

Aquí tienes el script que vamos a diseccionar juntos. Cópialo en un nuevo notebook Jupyter:

output
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 100)
y = np.sin(x)

plt.plot(x, y)
plt.title("Mi primera función seno")
plt.xlabel("x (radianes)")
plt.ylabel("sin(x)")
plt.grid(True)
plt.show()

Ejecuta la celda (tecla Shift + Enter). Deberías ver aparecer una bonita curva sinusoidal que oscila entre −1 y +1.

TIP¡Enhorabuena! Acabas de crear tu primer gráfico en Python. Ahora vamos a entender línea por línea qué está pasando.

Dissección línea por línea

Líneas 1-2: los imports

output
import numpy as np
import matplotlib.pyplot as plt

Dos convenciones universales:

WARNINGRegla de oroSiempre escribe import matplotlib.pyplot as plt y nunca import matplotlib as plt. El módulo pyplot contiene todas las funciones plot(), title(), etc.

Línea 3: generar el eje x

output
x = np.linspace(0, 2 * np.pi, 100)

np.linspace(inicio, fin, n) devuelve un array de n valores espaciados regularmente entre inicio y fin. Aquí: 100 puntos entre 0 y 2π (aprox. 6,28).

Resultado: x = [0.0, 0.063, 0.127, 0.190, ..., 6.283]

Línea 4: calcular y = sin(x)

output
y = np.sin(x)

NumPy aplica sin() a cada elemento del array x en una sola operación. Es la magia vectorial de NumPy: sin bucles, muy rápido.

Resultado: y = [0.0, 0.063, 0.127, ..., -0.0]

Línea 5: trazar la curva

output
plt.plot(x, y)

plt.plot(x, y) dibuja una línea que une cada punto (x[i], y[i]). Es la función más usada de todo Matplotlib.

Líneas 6-8: título, etiquetas y cuadrícula

output
plt.title("Mi primera función seno")
plt.xlabel("x (radianes)")
plt.ylabel("sin(x)")
plt.grid(True)

Primer gráfico en línea con datos reales

NOTEObjetivo — Pasar de datos sintéticos (seno, coseno) a datos reales. Cargar un archivo CSV con Pandas, comprender la estructura y trazar un gráfico de líneas profesional.

Objetivos pedagógicos

TIPAl finalizar este módulo — Sabrás cargar un CSV, manipularlo con Pandas, trazar una o varias series temporales y exportar todo de forma limpia.

Nuestro dataset: ventas mensuales ficticias

Para este ejercicio creamos un pequeño DataFrame con 12 meses de ventas para 3 productos diferentes:

output
import pandas as pd
import matplotlib.pyplot as plt

data = {
    "Mois": ["Jan", "Fev", "Mar", "Avr", "Mai", "Juin",
             "Juil", "Aout", "Sep", "Oct", "Nov", "Dec"],
    "Produit A": [120, 135, 148, 160, 175, 210,
                   250, 245, 200, 170, 140, 290],
    "Produit B": [80, 85, 90, 95, 100, 110,
                   130, 135, 120, 100, 90, 180],
    "Produit C": [50, 55, 60, 70, 85, 100,
                   120, 115, 95, 75, 60, 150],
}
df = pd.DataFrame(data)
print(df.head())

Resultado mostrado:

output
Mois  Produit A  Produit B  Produit C
0  Jan        120         80         50
1  Fev        135         85         55
2  Mar        148         90         60
3  Avr        160         95         70
4  Mai        175        100         85
TIP¿Por qué un DataFrame? — Un DataFrame de Pandas es una tabla estructurada (columnas con nombre, filas indexadas). Es el formato estándar para pasar datos a Matplotlib o Seaborn.

Trazar una sola columna

output
fig, ax = plt.subplots(figsize=(10, 5))

ax.plot(df["Mois"], df["Produit A"], color="purple", linewidth=2)
ax.set_title("Ventas mensuales del Producto A", fontsize=14)
ax.set_xlabel("Mes")
ax.set_ylabel("Unidades vendidas")
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

Obtienes un gráfico limpio que muestra la estacionalidad de las ventas (pico en julio, explosión en diciembre).

Trazar varias series en el mismo gráfico

output
fig, ax = plt.subplots(figsize=(12, 6))

ax.plot(df["Mois"], df["Produit A"], label="Produit A", linewidth=2, marker="o")
ax.plot(df["Mois"], df["Produit B"], label="Produit B", linewidth=2, marker="s")
ax.plot(df["Mois"], df["Produit C"], label="Produit C", linewidth=2, marker="^")

ax.set_title("Ventas mensuales por producto", fontsize=14, pad=15)
ax.set_xlabel("Mes", fontsize=12)
ax.set_ylabel("Unidades vendidas", fontsize=12)
ax.legend(loc="upper left", fontsize=11)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

Tres nuevas técnicas aplicadas:

Marcadores disponibles

CódigoMarcadorCódigoMarcador
"o"Círculo"s"Cuadrado
"^"Triángulo arriba"v"Triángulo abajo
"<"Triángulo izquierda">"Triángulo derecha
"D"Diamante"d"Diamante fino
"*"Estrella"+"Más
"x"Cruz"."Punto
"P"Más relleno"X"Cruz rellena

Cargar un archivo CSV real

En la vida real tus datos están en un archivo .csv. Así es como se carga:

output
# Si el archivo está en la misma carpeta
df = pd.read_csv("ventes.csv")

# Si el archivo está en la web
url = "https://raw.githubusercontent.com/exemple/data/main/ventes.csv"
df = pd.read_csv(url)

# Con otro separador (punto y coma)
df = pd.read_csv("ventes.csv", sep=";")

# Con parsing automático de fechas
df = pd.read_csv("ventes.csv", parse_dates=["date"])

print(df.head())
print(df.dtypes)
NOTETruco de depuración — Siempre verifica df.dtypes después de cargar. Si una columna que debería ser numérica aparece como object, es que hay comas decimales francesas o celdas vacías que limpiar.

Truco Pandas + Matplotlib: atajo integrado

Pandas tiene su propio wrapper de Matplotlib. Puedes trazar directamente desde un DataFrame:

output
df.set_index("Mois").plot(figsize=(10, 5), marker="o")
plt.title("Ventas por producto (estilo Pandas)")
plt.ylabel("Unidades")
plt.grid(True, alpha=0.3)
plt.show()
va-plus-loin

Este artículo cubre los extractos más útiles — el curso completo Python Matplotlib Seaborn (11 capítulos, 37 lecciones, ejercicios corregidos y proyecto final) te lleva hasta el final.

./acceder-au-cours-complet curso gratuito: Dominar Claude Code

FAQ

¿Cuánto tiempo se necesita para aprender Python Matplotlib Seaborn?
Con una progresión estructurada (11 capítulos, 37 lecciones cortas y prácticas) se alcanza un nivel operativo en unas semanas dedicando 30-60 minutos al día. Lo importante es practicar cada concepto inmediatamente.
¿Se necesitan requisitos previos?
Con nociones básicas de informática basta. Si sabes usar un terminal y leer código sencillo, estás listo.
¿Por dónde empezar concretamente?
Reproduce los comandos de este artículo y sigue el curso completo Python Matplotlib Seaborn: encadena las 37 lecciones en orden, con ejercicios y proyecto final.

📬 ¿Quieres recibir este tipo de guía cada semana? Suscríbete gratis — código real, cero relleno.