Matplotlib: Creación de gráficos
Domina la creación de gráficos en Matplotlib. Aprende a generar visualizaciones impactantes para tus proyectos de análisis de datos en Python.
Aprende Matplotlib GRATIS y certifícateMatplotlib es una herramienta extremadamente versátil para la creación de visualizaciones. En este módulo exploraremos los diferentes tipos de gráficos que podemos crear, desde los más básicos hasta los más complejos, comprendiendo sus características y casos de uso específicos.
Gráficos básicos
Los gráficos más elementales en Matplotlib son los de líneas, barras y dispersión. Estos constituyen la base sobre la que se construyen visualizaciones más sofisticadas.
Gráficos de línea
Los gráficos de línea son perfectos para representar la evolución de una variable a lo largo del tiempo o en función de otra variable continua:
import matplotlib.pyplot as plt
import numpy as np
# Datos para nuestro gráfico
x = np.linspace(0, 10, 100) # 100 puntos entre 0 y 10
y = np.sin(x)
# Crear el gráfico de línea básico
plt.figure(figsize=(8, 4))
plt.plot(x, y)
plt.title('Función seno')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.grid(True)
plt.show()
Podemos representar múltiples líneas en el mismo gráfico, lo que resulta útil para comparar diferentes series de datos:
plt.figure(figsize=(10, 5))
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.plot(x, np.tan(x), label='tan(x)', linestyle='--')
plt.title('Funciones trigonométricas')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)
plt.ylim(-2, 2) # Limitamos el eje y para mejor visualización
plt.show()
Gráficos de dispersión (scatter plots)
Los gráficos de dispersión son ideales para visualizar la relación entre dos variables y detectar patrones o correlaciones:
# Generar datos aleatorios correlacionados
np.random.seed(42)
x = np.random.normal(0, 1, 100)
y = x + np.random.normal(0, 0.5, 100)
plt.figure(figsize=(8, 6))
plt.scatter(x, y, alpha=0.7)
plt.title('Gráfico de dispersión')
plt.xlabel('Variable X')
plt.ylabel('Variable Y')
plt.grid(True)
plt.show()
Podemos personalizar nuestros gráficos de dispersión añadiendo una tercera dimensión mediante el color o el tamaño de los puntos:
# Añadimos una tercera variable
z = np.abs(x * y)
plt.figure(figsize=(10, 8))
scatter = plt.scatter(x, y,
c=z, # Color según valor de z
s=z*100, # Tamaño según valor de z
alpha=0.7, # Transparencia
cmap='viridis') # Mapa de colores
plt.colorbar(scatter, label='|x*y|')
plt.title('Gráfico de dispersión con color y tamaño variable')
plt.xlabel('Variable X')
plt.ylabel('Variable Y')
plt.grid(True)
plt.show()
Gráficos de barras
Los gráficos de barras son especialmente útiles para comparar categorías o grupos discretos:
# Datos para nuestro gráfico de barras
categorias = ['A', 'B', 'C', 'D', 'E']
valores = [23, 45, 56, 78, 32]
plt.figure(figsize=(10, 6))
plt.bar(categorias, valores, color='skyblue', edgecolor='darkblue')
plt.title('Gráfico de barras simple')
plt.xlabel('Categorías')
plt.ylabel('Valores')
plt.grid(True, axis='y') # Solo líneas de cuadrícula horizontales
plt.show()
También podemos crear gráficos de barras agrupadas para comparar múltiples series:
# Datos para nuestro gráfico de barras agrupadas
categorias = ['Grupo 1', 'Grupo 2', 'Grupo 3', 'Grupo 4']
serie1 = [10, 25, 15, 30]
serie2 = [15, 18, 25, 18]
x = np.arange(len(categorias)) # Posiciones en el eje X
width = 0.35 # Ancho de las barras
fig, ax = plt.subplots(figsize=(10, 6))
rects1 = ax.bar(x - width/2, serie1, width, label='Serie A', color='skyblue')
rects2 = ax.bar(x + width/2, serie2, width, label='Serie B', color='lightcoral')
ax.set_title('Gráfico de barras agrupadas')
ax.set_xlabel('Grupos')
ax.set_ylabel('Valores')
ax.set_xticks(x)
ax.set_xticklabels(categorias)
ax.legend()
ax.grid(True, axis='y')
# Añadir etiquetas con los valores sobre cada barra
for rect in rects1 + rects2:
height = rect.get_height()
ax.annotate(f'{height}',
xy=(rect.get_x() + rect.get_width()/2, height),
xytext=(0, 3), # 3 puntos de desplazamiento vertical
textcoords="offset points",
ha='center', va='bottom')
plt.show()
Gráficos de barras horizontales
A veces, especialmente cuando tenemos etiquetas largas, es preferible utilizar barras horizontales:
# Datos con etiquetas largas
paises = ['Estados Unidos', 'China', 'Japón', 'Alemania', 'Reino Unido', 'Francia']
valores = [21.4, 16.8, 5.0, 4.2, 3.2, 2.9]
# Ordenamos los datos para mejor visualización
indices_ordenados = np.argsort(valores)
paises_ordenados = [paises[i] for i in indices_ordenados]
valores_ordenados = [valores[i] for i in indices_ordenados]
plt.figure(figsize=(10, 6))
plt.barh(paises_ordenados, valores_ordenados, color='lightgreen')
plt.title('PIB de principales economías (billones USD)')
plt.xlabel('PIB (billones USD)')
plt.grid(True, axis='x')
plt.tight_layout() # Ajusta automáticamente los márgenes
plt.show()
Gráficos estadísticos
Matplotlib ofrece diversas opciones para visualizaciones estadísticas que nos permiten entender mejor la distribución de nuestros datos.
Histogramas
Los histogramas nos ayudan a visualizar la distribución de una variable continua:
# Generamos datos con distribución normal
np.random.seed(42)
datos = np.random.normal(loc=0, scale=1, size=1000)
plt.figure(figsize=(10, 6))
plt.hist(datos, bins=30, alpha=0.7, color='skyblue', edgecolor='black')
plt.title('Histograma de datos con distribución normal')
plt.xlabel('Valor')
plt.ylabel('Frecuencia')
plt.grid(True, alpha=0.3)
# Añadir línea vertical en la media
plt.axvline(datos.mean(), color='red', linestyle='--', linewidth=2, label=f'Media: {datos.mean():.2f}')
plt.legend()
plt.show()
Diagramas de caja (boxplots)
Los diagramas de caja son perfectos para visualizar la distribución de los datos y detectar valores atípicos:
# Generamos varios conjuntos de datos
np.random.seed(42)
datos1 = np.random.normal(0, 1, 100)
datos2 = np.random.normal(2, 0.5, 100)
datos3 = np.random.normal(1, 1.5, 100)
# Creamos un diagrama de caja con los tres conjuntos
plt.figure(figsize=(10, 6))
plt.boxplot([datos1, datos2, datos3],
patch_artist=True, # Rellena las cajas con color
labels=['Grupo A', 'Grupo B', 'Grupo C'],
boxprops=dict(facecolor='lightblue'))
plt.title('Diagrama de caja comparativo')
plt.ylabel('Valor')
plt.grid(True, linestyle='--', alpha=0.3)
plt.show()
Diagramas de violín
Los diagramas de violín combinan características de los boxplots y los histogramas, mostrando la distribución completa de los datos:
plt.figure(figsize=(10, 6))
plt.violinplot([datos1, datos2, datos3],
showmeans=True,
showmedians=True)
plt.title('Diagrama de violín comparativo')
plt.xticks([1, 2, 3], ['Grupo A', 'Grupo B', 'Grupo C'])
plt.ylabel('Valor')
plt.grid(True, linestyle='--', alpha=0.3)
plt.show()
Gráficos circulares y de área
Estos tipos de gráficos son útiles para mostrar proporciones y composiciones.
Gráficos circulares (pie charts)
Los gráficos circulares son ideales para mostrar la proporción de diferentes categorías respecto a un total:
# Datos para nuestro gráfico circular
categorias = ['Categoría A', 'Categoría B', 'Categoría C', 'Categoría D']
valores = [35, 25, 20, 20]
plt.figure(figsize=(10, 6))
plt.pie(valores,
labels=categorias,
autopct='%1.1f%%', # Muestra el porcentaje con un decimal
startangle=90, # Ángulo de inicio
shadow=True, # Sombra
explode=(0.1, 0, 0, 0)) # Destaca el primer elemento
plt.title('Distribución por categorías')
plt.axis('equal') # Asegura que el círculo se vea como un círculo
plt.show()
Es importante mencionar que los gráficos circulares, aunque populares, no siempre son la mejor opción para representar datos. Cuando tenemos muchas categorías o queremos comparar con precisión, suelen ser preferibles los gráficos de barras.
Gráficos de área
Los gráficos de área son útiles para mostrar la evolución de varias categorías a lo largo del tiempo, especialmente cuando queremos destacar la contribución relativa de cada una:
# Datos para nuestro gráfico de área
x = np.arange(10)
y1 = np.random.randint(10, 20, 10)
y2 = np.random.randint(5, 15, 10)
y3 = np.random.randint(0, 10, 10)
plt.figure(figsize=(10, 6))
plt.stackplot(x, y1, y2, y3,
labels=['Producto A', 'Producto B', 'Producto C'],
alpha=0.8,
colors=['skyblue', 'lightgreen', 'lightcoral'])
plt.title('Ventas por producto a lo largo del tiempo')
plt.xlabel('Tiempo')
plt.ylabel('Unidades vendidas')
plt.legend(loc='upper left')
plt.grid(True)
plt.show()
Gráficos en 3D
Matplotlib también permite crear visualizaciones en tres dimensiones, lo que resulta especialmente útil para datos que dependen de dos variables independientes.
Para trabajar con gráficos 3D, necesitamos importar el módulo específico:
from mpl_toolkits.mplot3d import Axes3D
# Creamos datos para una superficie 3D
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
# Creamos la figura con ejes 3D
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
# Dibujamos la superficie
surface = ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none', alpha=0.8)
# Añadimos etiquetas y título
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('Superficie 3D')
# Añadimos una barra de color
fig.colorbar(surface, ax=ax, shrink=0.5, aspect=5)
plt.show()
También podemos crear gráficos de dispersión en 3D:
# Datos para dispersión 3D
n = 100
x = np.random.normal(0, 1, n)
y = np.random.normal(0, 1, n)
z = np.random.normal(0, 1, n)
colors = np.random.rand(n)
fig = plt.figur
Lecciones de este módulo de Matplotlib
Lecciones de programación del módulo Creación de gráficos del curso de Matplotlib.
Ejercicios de programación en este módulo de Matplotlib
Evalúa tus conocimientos en Creación de gráficos con ejercicios de programación Creación de gráficos de tipo Test, Puzzle, Código y Proyecto con VSCode.