
Gráficos Básicos con Matplotlib: Tipos de Gráficos Esenciales
Aprende a crear los tipos de gráficos más comunes con Matplotlib: líneas, dispersión, barras, áreas y más con ejemplos prácticos.
¡Domina los tipos de gráficos más utilizados en Matplotlib! En este tutorial aprenderás a crear gráficos de líneas, dispersión, barras, áreas y otros tipos básicos que son fundamentales para la visualización de datos.
Objetivo: Aprender a crear y personalizar los tipos de gráficos más comunes en Matplotlib con ejemplos prácticos y casos de uso reales.
Índice
- Gráficos de Líneas
- Gráficos de Dispersión
- Gráficos de Barras
- Gráficos de Área
- Gráficos de Escalera
- Gráficos de Tallo
- Combinando Múltiples Tipos
- Casos de Uso Prácticos
Gráficos de Líneas
Los gráficos de líneas son ideales para mostrar tendencias a lo largo del tiempo o relaciones continuas entre variables.
Gráfico de Línea Básico
import matplotlib.pyplot as plt
import numpy as np
# Datos
x = np.linspace(0, 10, 100)
y = np.sin(x)
# Crear gráfico
plt.figure(figsize=(10, 6))
plt.plot(x, y)
# Personalización básica
plt.xlabel('Tiempo')
plt.ylabel('Amplitud')
plt.title('Función Seno')
plt.grid(True, alpha=0.3)
plt.show()
Múltiples Líneas
import matplotlib.pyplot as plt
import numpy as np
# Datos
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x + np.pi/4)
# Crear gráfico con múltiples líneas
plt.figure(figsize=(12, 8))
plt.plot(x, y1, 'b-', label='sin(x)', linewidth=2)
plt.plot(x, y2, 'r--', label='cos(x)', linewidth=2)
plt.plot(x, y3, 'g:', label='sin(x + π/4)', linewidth=2)
# Personalización
plt.xlabel('x', fontsize=12)
plt.ylabel('y', fontsize=12)
plt.title('Funciones Trigonométricas', fontsize=14, fontweight='bold')
plt.legend(fontsize=12)
plt.grid(True, alpha=0.3)
# Agregar líneas de referencia
plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)
plt.axvline(x=np.pi, color='k', linestyle='-', alpha=0.3)
plt.show()
Estilos de Línea
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 5, 50)
# Diferentes estilos de línea
estilos = ['-', '--', '-.', ':', 'solid', 'dashed', 'dashdot', 'dotted']
plt.figure(figsize=(12, 8))
for i, estilo in enumerate(estilos):
y = np.sin(x + i * 0.5)
plt.plot(x, y, estilo, label=f'Estilo: {estilo}', linewidth=2)
plt.xlabel('x')
plt.ylabel('sin(x + offset)')
plt.title('Estilos de Línea en Matplotlib')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
Fig. 1: Ejemplo de múltiples líneas con diferentes estilos y colores
Gráficos de Dispersión
Los gráficos de dispersión muestran la relación entre dos variables numéricas, ideales para identificar correlaciones y patrones.
Gráfico de Dispersión Básico
import matplotlib.pyplot as plt
import numpy as np
# Generar datos aleatorios
np.random.seed(42)
x = np.random.randn(100)
y = 2 * x + np.random.randn(100) * 0.5
# Crear gráfico de dispersión
plt.figure(figsize=(10, 6))
plt.scatter(x, y, alpha=0.6, s=50)
plt.xlabel('Variable X')
plt.ylabel('Variable Y')
plt.title('Gráfico de Dispersión Básico')
plt.grid(True, alpha=0.3)
plt.show()
Personalización Avanzada
import matplotlib.pyplot as plt
import numpy as np
# Generar datos más complejos
np.random.seed(42)
n = 200
x = np.random.randn(n)
y = x * 2 + np.random.randn(n)
colors = np.random.rand(n) # Colores aleatorios
sizes = 100 * np.random.rand(n) # Tamaños aleatorios
# Crear gráfico con personalización
plt.figure(figsize=(12, 8))
scatter = plt.scatter(x, y, c=colors, s=sizes, alpha=0.6,
cmap='viridis', edgecolors='black', linewidth=0.5)
# Agregar barra de colores
plt.colorbar(scatter, label='Intensidad')
plt.xlabel('Variable X', fontsize=12)
plt.ylabel('Variable Y', fontsize=12)
plt.title('Gráfico de Dispersión con Personalización', fontsize=14, fontweight='bold')
plt.grid(True, alpha=0.3)
plt.show()
Múltiples Conjuntos de Datos
import matplotlib.pyplot as plt
import numpy as np
# Generar tres conjuntos de datos
np.random.seed(42)
n = 50
# Grupo 1
x1 = np.random.normal(0, 1, n)
y1 = np.random.normal(0, 1, n)
# Grupo 2
x2 = np.random.normal(3, 1, n)
y2 = np.random.normal(3, 1, n)
# Grupo 3
x3 = np.random.normal(0, 1, n)
y3 = np.random.normal(3, 1, n)
# Crear gráfico
plt.figure(figsize=(10, 8))
plt.scatter(x1, y1, c='red', label='Grupo 1', alpha=0.7, s=50)
plt.scatter(x2, y2, c='blue', label='Grupo 2', alpha=0.7, s=50)
plt.scatter(x3, y3, c='green', label='Grupo 3', alpha=0.7, s=50)
plt.xlabel('Variable X')
plt.ylabel('Variable Y')
plt.title('Múltiples Grupos en Gráfico de Dispersión')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
Fig. 2: Gráfico de dispersión con colores y tamaños variables
Gráficos de Barras
Los gráficos de barras son excelentes para comparar categorías o mostrar frecuencias.
Gráfico de Barras Vertical
import matplotlib.pyplot as plt
# Datos
categorias = ['Python', 'Java', 'JavaScript', 'C++', 'PHP']
usuarios = [85, 72, 68, 45, 38]
# Crear gráfico de barras
plt.figure(figsize=(10, 6))
bars = plt.bar(categorias, usuarios, color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd'])
# Personalización
plt.xlabel('Lenguajes de Programación')
plt.ylabel('Número de Usuarios (millones)')
plt.title('Popularidad de Lenguajes de Programación')
plt.grid(True, alpha=0.3, axis='y')
# Agregar valores encima de las barras
for bar, valor in zip(bars, usuarios):
plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1,
f'{valor}M', ha='center', va='bottom', fontweight='bold')
plt.show()
Gráfico de Barras Horizontal
import matplotlib.pyplot as plt
# Datos
paises = ['China', 'India', 'Estados Unidos', 'Indonesia', 'Brasil']
poblacion = [1439, 1380, 331, 273, 213]
# Crear gráfico de barras horizontal
plt.figure(figsize=(10, 6))
bars = plt.barh(paises, poblacion, color='skyblue', edgecolor='navy', linewidth=1)
# Personalización
plt.xlabel('Población (millones)')
plt.ylabel('País')
plt.title('Población por País (2023)')
plt.grid(True, alpha=0.3, axis='x')
# Agregar valores al final de las barras
for bar, valor in zip(bars, poblacion):
plt.text(bar.get_width() + 10, bar.get_y() + bar.get_height()/2,
f'{valor}M', ha='left', va='center', fontweight='bold')
plt.show()
Barras Agrupadas
import matplotlib.pyplot as plt
import numpy as np
# Datos
categorias = ['Q1', 'Q2', 'Q3', 'Q4']
ventas_A = [120, 150, 180, 200]
ventas_B = [100, 130, 160, 190]
# Posiciones de las barras
x = np.arange(len(categorias))
ancho = 0.35
# Crear gráfico
plt.figure(figsize=(10, 6))
bars1 = plt.bar(x - ancho/2, ventas_A, ancho, label='Producto A',
color='lightblue', edgecolor='blue', linewidth=1)
bars2 = plt.bar(x + ancho/2, ventas_B, ancho, label='Producto B',
color='lightcoral', edgecolor='red', linewidth=1)
# Personalización
plt.xlabel('Trimestre')
plt.ylabel('Ventas ($)')
plt.title('Ventas por Trimestre - Comparación de Productos')
plt.xticks(x, categorias)
plt.legend()
plt.grid(True, alpha=0.3, axis='y')
# Agregar valores
for bars in [bars1, bars2]:
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2, height + 5,
f'${height}', ha='center', va='bottom', fontweight='bold')
plt.show()
Fig. 3: Barras agrupadas para comparar múltiples series de datos
Gráficos de Área
Los gráficos de área muestran la evolución de una o más variables, rellenando el área bajo las líneas.
Gráfico de Área Básico
import matplotlib.pyplot as plt
import numpy as np
# Datos
x = np.linspace(0, 10, 100)
y = np.sin(x) + 2
# Crear gráfico de área
plt.figure(figsize=(10, 6))
plt.fill_between(x, y, alpha=0.5, color='skyblue', label='Área bajo la curva')
plt.plot(x, y, color='blue', linewidth=2, label='Línea')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Gráfico de Área Básico')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
Áreas Apiladas
import matplotlib.pyplot as plt
import numpy as np
# Datos
x = np.arange(1, 13)
ventas_online = [120, 150, 180, 200, 250, 300, 280, 320, 350, 380, 400, 420]
ventas_tienda = [200, 220, 240, 260, 280, 300, 320, 340, 360, 380, 400, 420]
# Crear gráfico de áreas apiladas
plt.figure(figsize=(12, 8))
plt.fill_between(x, 0, ventas_online, alpha=0.7, color='lightblue',
label='Ventas Online', edgecolor='blue', linewidth=1)
plt.fill_between(x, ventas_online, ventas_online + ventas_tienda, alpha=0.7,
color='lightcoral', label='Ventas Tienda', edgecolor='red', linewidth=1)
# Línea total
total = np.array(ventas_online) + np.array(ventas_tienda)
plt.plot(x, total, 'k-', linewidth=2, label='Total')
plt.xlabel('Mes')
plt.ylabel('Ventas ($)')
plt.title('Ventas Online vs Tienda - Áreas Apiladas')
plt.xticks(x, ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun',
'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'])
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
Fig. 4: Gráfico de área apilada mostrando contribución de diferentes componentes
Gráficos de Escalera
Los gráficos de escalera muestran cambios discretos en los datos, útiles para series temporales con cambios abruptos.
import matplotlib.pyplot as plt
import numpy as np
# Datos de temperatura por hora
horas = np.arange(0, 25, 1)
temperatura = [15, 14, 13, 12, 11, 12, 15, 18, 22, 25, 28, 30, 32,
33, 32, 30, 28, 25, 22, 20, 18, 17, 16, 15, 14]
# Crear gráfico de escalera
plt.figure(figsize=(12, 6))
# Gráfico de línea normal
plt.plot(horas, temperatura, 'b-', alpha=0.3, label='Línea continua')
# Gráfico de escalera
plt.step(horas, temperatura, 'r-', linewidth=2, where='post', label='Escalera')
plt.xlabel('Hora del día')
plt.ylabel('Temperatura (°C)')
plt.title('Temperatura a lo Largo del Día')
plt.xticks(np.arange(0, 25, 2))
plt.grid(True, alpha=0.3)
plt.legend()
plt.show()
Gráficos de Tallo
Los gráficos de tallo muestran la distribución de datos discretos, similares a histogramas pero más simples.
import matplotlib.pyplot as plt
import numpy as np
# Datos
x = np.arange(0.1, 4, 0.1)
y = np.exp(-x)
# Crear gráfico de tallo
plt.figure(figsize=(10, 6))
markerline, stemlines, baseline = plt.stem(x, y, linefmt='b-', markerfmt='bo',
basefmt='k-', label='Datos')
# Personalización
plt.setp(stemlines, linewidth=1.5)
plt.setp(markerline, markersize=6)
plt.xlabel('x')
plt.ylabel('exp(-x)')
plt.title('Gráfico de Tallo: Función Exponencial')
plt.grid(True, alpha=0.3)
plt.legend()
plt.show()
Combinando Múltiples Tipos
A menudo es útil combinar diferentes tipos de gráficos en una misma visualización.
import matplotlib.pyplot as plt
import numpy as np
# Datos
meses = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun']
ventas = [120, 150, 180, 200, 250, 300]
clientes = [45, 52, 48, 61, 55, 67]
satisfaccion = [4.2, 4.1, 4.3, 4.4, 4.5, 4.6]
# Crear figura con dos ejes Y
fig, ax1 = plt.subplots(figsize=(12, 8))
# Barras para ventas
bars = ax1.bar(meses, ventas, color='lightblue', alpha=0.7, label='Ventas ($)')
ax1.set_xlabel('Mes')
ax1.set_ylabel('Ventas ($)', color='blue')
ax1.tick_params(axis='y', labelcolor='blue')
# Segundo eje Y para clientes
ax2 = ax1.twinx()
line = ax2.plot(meses, clientes, 'r-o', linewidth=2, label='Clientes')
ax2.set_ylabel('Número de Clientes', color='red')
ax2.tick_params(axis='y', labelcolor='red')
# Gráfico de dispersión para satisfacción
ax3 = ax1.twinx()
ax3.spines['right'].set_position(('outward', 60))
scatter = ax3.scatter(meses, satisfaccion, c='green', s=100, label='Satisfacción', marker='s')
ax3.set_ylabel('Satisfacción (1-5)', color='green')
ax3.tick_params(axis='y', labelcolor='green')
ax3.set_ylim(3.5, 5)
# Título y leyendas
plt.title('Análisis de Ventas, Clientes y Satisfacción')
ax1.grid(True, alpha=0.3)
# Combinar leyendas
lines1, labels1 = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
lines3, labels3 = ax3.get_legend_handles_labels()
ax1.legend(lines1 + lines2 + lines3, labels1 + labels2 + labels3, loc='upper left')
plt.show()
Casos de Uso Prácticos
1. Análisis de Tendencias de Ventas
import matplotlib.pyplot as plt
import numpy as np
# Simular datos de ventas mensuales
np.random.seed(42)
meses = np.arange(1, 13)
ventas_base = 1000 + 50 * meses
ruido = np.random.normal(0, 100, 12)
ventas = ventas_base + ruido
# Crear visualización completa
plt.figure(figsize=(15, 10))
# Gráfico principal
plt.subplot(2, 2, 1)
plt.plot(meses, ventas, 'b-o', linewidth=2, markersize=6)
plt.xlabel('Mes')
plt.ylabel('Ventas ($)')
plt.title('Tendencia de Ventas Mensuales')
plt.grid(True, alpha=0.3)
# Histograma de ventas
plt.subplot(2, 2, 2)
plt.hist(ventas, bins=6, edgecolor='black', alpha=0.7)
plt.xlabel('Rango de Ventas')
plt.ylabel('Frecuencia')
plt.title('Distribución de Ventas')
plt.grid(True, alpha=0.3)
# Gráfico de dispersión: mes vs ventas
plt.subplot(2, 2, 3)
plt.scatter(meses, ventas, s=100, alpha=0.6, c=ventas, cmap='viridis')
plt.xlabel('Mes')
plt.ylabel('Ventas ($)')
plt.title('Relación Mes-Ventas')
plt.colorbar(label='Ventas ($)')
plt.grid(True, alpha=0.3)
# Gráfico de barras comparativo
plt.subplot(2, 2, 4)
meses_str = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun',
'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic']
plt.bar(meses_str, ventas, color='skyblue', edgecolor='navy')
plt.xlabel('Mes')
plt.ylabel('Ventas ($)')
plt.title('Ventas por Mes')
plt.xticks(rotation=45)
plt.grid(True, alpha=0.3, axis='y')
plt.tight_layout()
plt.show()
2. Visualización de Datos Científicos
import matplotlib.pyplot as plt
import numpy as np
# Simular datos de experimento científico
np.random.seed(42)
tiempo = np.linspace(0, 100, 1000)
senal = np.sin(0.1 * tiempo) + 0.5 * np.sin(0.5 * tiempo) + 0.1 * np.random.randn(1000)
# Crear visualización científica
plt.figure(figsize=(15, 10))
# Señal temporal
plt.subplot(2, 2, 1)
plt.plot(tiempo, senal, 'b-', linewidth=1, alpha=0.8)
plt.xlabel('Tiempo (s)')
plt.ylabel('Amplitud')
plt.title('Señal Temporal')
plt.grid(True, alpha=0.3)
# Histograma de la señal
plt.subplot(2, 2, 2)
plt.hist(senal, bins=50, edgecolor='black', alpha=0.7, density=True)
plt.xlabel('Amplitud')
plt.ylabel('Densidad de Probabilidad')
plt.title('Distribución de Amplitud')
plt.grid(True, alpha=0.3)
# Espectro de frecuencia (simplificado)
plt.subplot(2, 2, 3)
frecuencias = np.fft.fftfreq(len(tiempo), tiempo[1] - tiempo[0])
espectro = np.abs(np.fft.fft(senal))
plt.plot(frecuencias[:len(frecuencias)//2], espectro[:len(espectro)//2], 'r-')
plt.xlabel('Frecuencia (Hz)')
plt.ylabel('Magnitud')
plt.title('Espectro de Frecuencia')
plt.grid(True, alpha=0.3)
# Diagrama de dispersión con densidad
plt.subplot(2, 2, 4)
plt.scatter(tiempo[::10], senal[::10], alpha=0.6, s=20, c=senal[::10], cmap='coolwarm')
plt.xlabel('Tiempo (s)')
plt.ylabel('Amplitud')
plt.title('Diagrama de Dispersión con Densidad')
plt.colorbar(label='Amplitud')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
¡Has aprendido los tipos de gráficos básicos más importantes en Matplotlib! Ahora puedes crear visualizaciones efectivas para diferentes tipos de datos y casos de uso.
En el próximo tutorial aprenderás sobre Personalización de Gráficos para hacer tus visualizaciones aún más atractivas y profesionales.
No hay comentarios aún
Sé el primero en comentar este tutorial.