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.
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.
- Introducción e Instalación
- Bases de Matplotlib
- Gráficos esenciales de Matplotlib
- Personalización y estilos
- Subplots y figuras complejas
Exploración y visualizaciones iniciales (EDA)
¿Por qué una EDA antes del dashboard?
En esta lección vamos a crear 5 gráficos exploratorios para comprender:
Setup común
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
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()
Gráfico 2: Evolución mensual del CA
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()
Gráfico 3: Rendimiento por categoría
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()
Gráfico 4: Rendimiento por tienda (boxplot)
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()
Gráfico 5: Correlaciones numéricas (heatmap)
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
Objetivos pedagógicos
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:
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.
Dissección línea por línea
Líneas 1-2: los imports
import numpy as np import matplotlib.pyplot as plt
Dos convenciones universales:
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
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)
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
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
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
Objetivos pedagógicos
Nuestro dataset: ventas mensuales ficticias
Para este ejercicio creamos un pequeño DataFrame con 12 meses de ventas para 3 productos diferentes:
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:
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
Trazar una sola columna
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
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ódigo | Marcador | Código | Marcador |
|---|---|---|---|
"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:
# 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)
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:
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()
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 CodeFAQ
¿Cuánto tiempo se necesita para aprender Python Matplotlib Seaborn?
¿Se necesitan requisitos previos?
¿Por dónde empezar concretamente?
📬 ¿Quieres recibir este tipo de guía cada semana? Suscríbete gratis — código real, cero relleno.