Tipos de Gráficos¶
Introducción¶
En estadística, un gráfico es una representación visual de datos que permite resumir, analizar y comunicar información de manera efectiva. Esta clase cubre los seis tipos fundamentales, con ejemplos en matplotlib y seaborn.
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
# Estilo general
sns.set_theme(style="whitegrid")
Anatomía de un Gráfico¶
Antes de graficar, conviene conocer los componentes que matplotlib expone:

| Componente | Descripción |
|---|---|
| Figure | Contenedor principal; puede tener uno o varios ejes. |
| Axes | El área de dibujo con sus ejes x e y. |
| Title | Texto descriptivo en la parte superior. |
| Axis Labels | Etiquetas de cada eje (xlabel, ylabel). |
| Legend | Caja que explica el significado de cada serie. |
| Ticks / Grid | Marcas y cuadrícula para facilitar la lectura. |
fig, ax = plt.subplots()
ax.set_title("Título del gráfico")
ax.set_xlabel("Eje x")
ax.set_ylabel("Eje y")
Gráfico de Línea¶
Cuándo: evolución de una variable numérica a lo largo de un eje ordenado — típicamente el tiempo. El orden de los puntos importa.
# Básico — matplotlib
x = [1, 2, 3, 4, 5]
y = [10, 12, 15, 20, 22]
plt.plot(x, y, marker="o")
plt.xlabel("Eje x")
plt.ylabel("Eje y")
plt.title("Gráfico de línea")
plt.show()
# Múltiples series — matplotlib
x = np.arange(1, 11)
y1 = np.random.randint(5, 20, size=10)
y2 = np.random.randint(5, 20, size=10)
fig, ax = plt.subplots()
ax.plot(x, y1, marker="o", label="Serie A")
ax.plot(x, y2, marker="s", linestyle="--", label="Serie B")
ax.set_xlabel("Período")
ax.set_ylabel("Valor")
ax.set_title("Comparación de series")
ax.legend()
plt.show()
# Con banda de confianza — seaborn `lineplot`
tips = sns.load_dataset("tips")
sns.lineplot(data=tips, x="size", y="total_bill", errorbar="sd")
plt.title("Cuenta promedio por tamaño de mesa (±1 SD)")
plt.show()
errorbar="sd"dibuja la banda ±1 desviación estándar automáticamente.
Gráfico de Dispersión¶
Cuándo: explorar la relación entre dos variables numéricas continuas. Detecta correlaciones, outliers y clusters.
# Básico — matplotlib
np.random.seed(0)
x = np.random.randn(100)
y = 2 * x + np.random.randn(100)
plt.scatter(x, y, alpha=0.6)
plt.xlabel("Variable X")
plt.ylabel("Variable Y")
plt.title("Gráfico de dispersión")
plt.show()
# Con regresión — seaborn `regplot`
tips = sns.load_dataset("tips")
sns.regplot(data=tips, x="total_bill", y="tip", scatter_kws={"alpha": 0.5})
plt.title("Propina vs cuenta total")
plt.show()
# Coloreado por categoría — seaborn `scatterplot`
iris = sns.load_dataset("iris")
sns.scatterplot(data=iris, x="sepal_length", y="petal_length",
hue="species", style="species")
plt.title("Iris: longitud de sépalo vs pétalo por especie")
plt.show()
# Matriz de dispersión — seaborn `pairplot`
sns.pairplot(iris, hue="species", corner=True)
plt.suptitle("Pairplot — dataset Iris", y=1.02)
plt.show()
Gráfico de Barras¶
Cuándo: comparar magnitudes entre categorías discretas sin orden intrínseco. Lo que importa es la altura relativa de cada barra, no la tendencia entre ellas.
# Básico — matplotlib
categorias = ["A", "B", "C", "D"]
valores = [15, 30, 22, 18]
plt.bar(categorias, valores, color="steelblue")
plt.xlabel("Categoría")
plt.ylabel("Valor")
plt.title("Gráfico de barras")
plt.show()
# Horizontal — matplotlib
plt.barh(categorias, valores, color="coral")
plt.xlabel("Valor")
plt.title("Barras horizontales")
plt.show()
# Agrupadas — seaborn `barplot`
tips = sns.load_dataset("tips")
sns.barplot(data=tips, x="day", y="total_bill", hue="sex",
palette="Set2", errorbar=None)
plt.title("Cuenta promedio por día y sexo")
plt.legend(title="Sexo")
plt.show()
# Apiladas — matplotlib
dias = ["Lun", "Mar", "Mié", "Jue", "Vie"]
grupo_a = [10, 15, 7, 12, 9]
grupo_b = [8, 10, 13, 6, 14]
x = np.arange(len(dias))
plt.bar(x, grupo_a, label="Grupo A")
plt.bar(x, grupo_b, bottom=grupo_a, label="Grupo B")
plt.xticks(x, dias)
plt.ylabel("Total")
plt.title("Barras apiladas")
plt.legend()
plt.show()
Gráfico: Histograma¶
Cuándo: visualizar la distribución de una variable numérica continua. El eje x se divide en intervalos (bins); el eje y muestra la frecuencia o densidad.
# Básico — matplotlib
datos = np.random.normal(loc=170, scale=10, size=300)
plt.hist(datos, bins=20, edgecolor="white")
plt.xlabel("Altura (cm)")
plt.ylabel("Frecuencia")
plt.title("Distribución de alturas")
plt.show()
# Con curva de densidad — seaborn `histplot`
tips = sns.load_dataset("tips")
sns.histplot(tips["total_bill"], bins=20, kde=True, color="steelblue")
plt.title("Distribución de cuentas con KDE")
plt.show()
kde=Truesuperpone la estimación de densidad kernel (KDE).
# Comparar distribuciones — seaborn `kdeplot`
sns.kdeplot(data=tips, x="total_bill", hue="sex", fill=True, alpha=0.4)
plt.title("KDE: cuenta por sexo")
plt.show()
# Violinplot — versión rica del histograma
sns.violinplot(data=tips, x="day", y="total_bill", hue="sex",
split=True, palette="muted")
plt.title("Distribución de cuentas por día y sexo")
plt.show()
Gráfico: Heatmap¶
Cuándo: representar una matriz de valores numéricos usando color como codificación. Ideal para matrices de correlación, tablas de contingencia o datos tabulares densos.
# Matriz de correlación — seaborn `heatmap`
iris = sns.load_dataset("iris")
corr = iris.drop("species", axis=1).corr()
sns.heatmap(corr, annot=True, fmt=".2f", cmap="coolwarm", vmin=-1, vmax=1)
plt.title("Matriz de correlación — Iris")
plt.show()
annot=Trueimprime el valor numérico en cada celda.vmin/vmaxfijan la escala de color para facilitar la comparación.
# Tabla de contingencia — seaborn `heatmap`
tips = sns.load_dataset("tips")
tabla = tips.pivot_table(index="day", columns="sex",
values="total_bill", aggfunc="mean")
sns.heatmap(tabla, annot=True, fmt=".1f", cmap="YlGnBu")
plt.title("Cuenta promedio por día y sexo")
plt.show()
/tmp/ipykernel_6873/3129972279.py:3: FutureWarning: The default value of observed=False is deprecated and will change to observed=True in a future version of pandas. Specify observed=False to silence this warning and retain the current behavior tabla = tips.pivot_table(index="day", columns="sex",
Gráfico: Boxplot¶
Cuándo: comparar la distribución de una variable numérica entre grupos. Muestra mediana, cuartiles y outliers en una sola figura.
# Básico — matplotlib
datos = [np.random.normal(loc, 2, 100) for loc in [10, 12, 15]]
plt.boxplot(datos, labels=["Grupo A", "Grupo B", "Grupo C"])
plt.ylabel("Valor")
plt.title("Boxplot básico")
plt.show()
/tmp/ipykernel_6873/2386589001.py:4: MatplotlibDeprecationWarning: The 'labels' parameter of boxplot() has been renamed 'tick_labels' since Matplotlib 3.9; support for the old name will be dropped in 3.11. plt.boxplot(datos, labels=["Grupo A", "Grupo B", "Grupo C"])
# Por categoría — seaborn `boxplot`
tips = sns.load_dataset("tips")
sns.boxplot(data=tips, x="day", y="total_bill", hue="sex", palette="Set3")
plt.title("Distribución de cuentas por día y sexo")
plt.show()
# Boxplot + Stripplot (puntos individuales)
fig, ax = plt.subplots()
sns.boxplot(data=tips, x="day", y="total_bill", palette="Set3",
flierprops={"marker": ""}, ax=ax)
sns.stripplot(data=tips, x="day", y="total_bill",
color="black", alpha=0.3, jitter=True, ax=ax)
ax.set_title("Boxplot + datos individuales")
plt.show()
/tmp/ipykernel_6873/150624040.py:3: FutureWarning: Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect. sns.boxplot(data=tips, x="day", y="total_bill", palette="Set3",