Matplotlib: Personalización de gráficos
Personaliza gráficos en Matplotlib. Aprende a ajustar colores, estilos y elementos para crear visualizaciones únicas y profesionales en Python.
Aprende Matplotlib GRATIS y certifícateMatplotlib ofrece varias opciones para personalizar nuestros gráficos y ajustarlos a nuestras necesidades específicas. La personalización adecuada no solo mejora la estética de nuestras visualizaciones, sino que también aumenta su capacidad para comunicar información de manera efectiva.
El primer aspecto que podemos personalizar es el tamaño de la figura y su resolución. Esto se logra fácilmente al crear la figura mediante el parámetro figsize
(en pulgadas) y el parámetro dpi
(puntos por pulgada).
import matplotlib.pyplot as plt
import numpy as np
# Crear una figura de 10x6 pulgadas con 100 DPI
plt.figure(figsize=(10, 6), dpi=100)
# Datos de ejemplo
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.title('Función seno')
plt.show()
Los márgenes de la figura también son importantes para aprovechar mejor el espacio disponible. Podemos ajustarlos manualmente con subplots_adjust()
o automáticamente con tight_layout()
.
# Ajuste manual de márgenes
plt.subplots_adjust(left=0.1, right=0.95, top=0.95, bottom=0.1)
# O usar tight_layout para ajuste automático
plt.tight_layout()
La personalización de títulos, etiquetas y leyendas es fundamental para cualquier gráfico. Estas pueden modificarse en términos de tamaño, estilo, color y ubicación.
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x), label='Seno')
plt.plot(x, np.cos(x), label='Coseno')
plt.title('Funciones trigonométricas', fontsize=16, fontweight='bold')
plt.xlabel('Ángulo (rad)', fontsize=12)
plt.ylabel('Valor', fontsize=12)
plt.legend(loc='upper right', fontsize=12, frameon=True, framealpha=0.7)
plt.show()
Para la ubicación de la leyenda, puedes utilizar valores como:
- 'best' (ubicación óptima automática)
- 'upper right', 'upper left'
- 'lower right', 'lower left'
- 'center left', 'center right'
- 'lower center', 'upper center'
- 'center'
Los ejes del gráfico pueden personalizarse en diversos aspectos como sus límites, marcas (ticks) y etiquetas. Es recomendable trabajar con el objeto Axes
para tener mayor control.
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, np.sin(x))
# Establecer límites de ejes
ax.set_xlim(0, 10)
ax.set_ylim(-1.5, 1.5)
# Personalizar las marcas de los ejes
ax.set_xticks(np.arange(0, 11, 1))
ax.set_yticks(np.arange(-1, 1.1, 0.5))
# Estilo de las marcas y etiquetas
ax.tick_params(axis='both', which='major', labelsize=10, direction='out', length=6, width=1)
# Añadir cuadrícula
ax.grid(True, linestyle='--', alpha=0.7)
plt.show()
La escala de los ejes puede modificarse para representar mejor ciertos tipos de datos. Las escalas más comunes son:
- Logarítmica (
log
) - Simétrica logarítmica (
symlog
) - Logit (
logit
) - Lineal (
linear
, valor por defecto)
# Gráfica con escala logarítmica en el eje Y
plt.figure(figsize=(10, 6))
plt.plot(x, np.exp(x))
plt.yscale('log')
plt.title('Escala logarítmica en eje Y')
plt.grid(True)
plt.show()
Los estilos de línea permiten diferenciar múltiples series de datos en un mismo gráfico. Matplotlib ofrece varias opciones:
- Línea sólida (
-
) - Línea discontinua (
--
) - Línea punteada (
:
) - Línea punto-raya (
-.
)
estilos_linea = ['-', '--', '-.', ':']
etiquetas = ['Sólida', 'Discontinua', 'Punto-raya', 'Punteada']
plt.figure(figsize=(10, 6))
for i, estilo in enumerate(estilos_linea):
plt.plot(x, np.sin(x + i*0.5), linestyle=estilo, linewidth=2, label=etiquetas[i])
plt.legend()
plt.title('Diferentes estilos de línea')
plt.show()
Los marcadores son símbolos utilizados para representar puntos específicos en un gráfico. Algunos de los más utilizados son:
'o'
- círculo's'
- cuadrado'^'
- triángulo'*'
- estrella'+'
- símbolo más'x'
- equis
marcadores = ['o', 's', '^', '*', '+', 'x']
nombres = ['Círculo', 'Cuadrado', 'Triángulo', 'Estrella', 'Más', 'Equis']
plt.figure(figsize=(10, 6))
for i, marcador in enumerate(marcadores):
plt.plot(x[::10], np.sin(x[::10] + i*0.5), marker=marcador,
markersize=10, linestyle='-', label=nombres[i])
plt.legend()
plt.title('Diferentes tipos de marcadores')
plt.show()
La personalización de colores es otro aspecto fundamental. Matplotlib permite especificar colores de varias formas:
- Por nombre (
'red'
,'green'
,'blue'
, etc.) - Código hexadecimal (
'#FF0000'
para rojo) - Tupla RGB (valores de 0 a 1, como
(1, 0, 0)
para rojo) - Valor escalar mapeado a un colormap
# Colores por nombre
colores = ['red', 'green', 'blue', 'purple', 'orange']
plt.figure(figsize=(10, 6))
for i, color in enumerate(colores):
plt.plot(x, np.sin(x + i*0.5), color=color, linewidth=2, label=f'Color: {color}')
plt.legend()
plt.title('Diferentes colores por nombre')
plt.show()
Los mapas de colores (colormaps) son útiles para representar una tercera dimensión en los gráficos. Matplotlib incluye una amplia variedad:
- Secuenciales:
'viridis'
,'plasma'
,'inferno'
,'cividis'
- Divergentes:
'RdBu'
,'PiYG'
,'coolwarm'
- Cíclicos:
'twilight'
,'hsv'
- Cualitativos:
'Set1'
,'Set2'
,'tab10'
# Datos para contorno
x_grid = np.linspace(-3, 3, 100)
y_grid = np.linspace(-3, 3, 100)
X, Y = np.meshgrid(x_grid, y_grid)
Z = np.sin(X) * np.cos(Y)
plt.figure(figsize=(10, 8))
contour = plt.contourf(X, Y, Z, cmap='viridis', levels=20)
plt.colorbar(contour, label='Valor')
plt.title('Gráfico de contorno con colormap viridis')
plt.show()
Los gráficos de barras pueden personalizarse en términos de ancho, color, borde y etiquetas. Una técnica útil es añadir los valores sobre cada barra.
categorias = ['A', 'B', 'C', 'D', 'E']
valores = [25, 40, 30, 55, 15]
plt.figure(figsize=(10, 6))
barras = plt.bar(categorias, valores, width=0.6, edgecolor='black', linewidth=1.5)
# Colorear cada barra individualmente
colores = ['#FF9999', '#66B2FF', '#99FF99', '#FFCC99', '#FF99CC']
for barra, color in zip(barras, colores):
barra.set_color(color)
# Añadir valor sobre cada barra
for barra in barras:
altura = barra.get_height()
plt.text(barra.get_x() + barra.get_width()/2., altura + 1,
f'{int(altura)}', ha='center', va='bottom', fontsize=11)
plt.title('Gráfico de barras personalizado')
plt.ylim(0, max(valores) * 1.2) # Ajustar límite del eje Y
plt.show()
Los gráficos de dispersión (scatter) permiten personalizar el tamaño, color y transparencia de los puntos. Esto es útil para representar múltiples dimensiones de datos.
# Generar datos aleatorios
np.random.seed(42)
x_data = np.random.rand(50) * 10
y_data = np.random.rand(50) * 10
sizes = np.random.rand(50) * 500 # Tamaños variables
colors = np.random.rand(50) # Colores según valor
plt.figure(figsize=(10, 6))
scatter = plt.scatter(x_data, y_data, s=sizes, c=colors, cmap='viridis',
alpha=0.7, edgecolors='black', linewidths=1)
plt.colorbar(scatter, label='Valor de color')
plt.title('Gráfico de dispersión personalizado')
plt.xlabel('Eje X')
plt.ylabel('Eje Y')
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()
Matplotlib incluye varios estilos predefinidos que podemos utilizar para cambiar la apariencia general de nuestras gráficas. Algunos de los más populares son:
'default'
- El estilo por defecto'ggplot'
- Estilo similar a ggplot de R'seaborn'
- Basado en la biblioteca Seaborn'bmh'
- Estilo de blog Bayesiano'dark_background'
- Fondo oscuro, útil para presentaciones
# Ver los estilos disponibles
print(plt.style.available)
# Aplicar un estilo predefinido
plt.style.use('ggplot')
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x), 'o-', label='Seno')
plt.plot(x, np.cos(x), 'o-', label='Coseno')
plt.title('Gráfico con estilo ggplot')
plt.legend()
plt.show()
# Restaurar el estilo por defecto
plt.style.use('default')
También podemos crear estilos personalizados definiendo un diccionario de parámetros. Esto es útil para mantener un estilo consistente en todos nuestros gráficos.
# Definir un estilo personalizado como diccionario
estilo_personalizado = {
'axes.facecolor': '#f0f0f0',
'axes.edgecolor': '#333333',
'axes.grid': True,
'grid.color': '#999999',
'grid.linestyle': '--',
'axes.labelcolor': '#555555',
'xtick.color': '#555555',
'ytick.color': '#555555',
'text.color': '#333333',
'font.family': 'serif',
'font.size': 12,
'figure.facecolor': 'white',
'figure.figsize': [10, 6],
'lines.linewidth': 2,
'lines.markersize': 8
}
# Aplicar el estilo personalizado
with plt.rc_context(estilo_personalizado):
plt.figure()
plt.plot(x, np.sin(x), 'o-', label='Seno')
plt.plot(x, np.cos(x), 'o-', label='Coseno')
plt.title('Gráfico con estilo personalizado')
plt.legend()
plt.show()
Las anotaciones permiten destacar puntos específicos en la gráfica y añadir explicaciones. Son útiles para guiar al lector a través de la visualización.
plt.figure(figsize=(10, 6))
plt.plot(x, np.sin(x))
# Añadir texto en una posición arbitraria
plt.text(2, 0.5, 'Punto máximo local', fontsize=12)
# Añadir anotación con flecha
plt.annotate('Punto mínimo local',
xy=(6.3, -1), # Coordenadas del punto a señalar
xytext=(7, -0.5), # Coordenadas del texto
arrowprops=dict(facecolor='black', shrink=0.05, width=1.5),
fontsize=12)
plt.title('Gráfica con anotaciones')
plt.show()
Podemos añadir elementos decorativos como líneas, rectángulos y círculos a nuestras gráficas para resaltar áreas o puntos de interés.
from matplotlib.patches import Rectangle, Ellipse
fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, np.sin(x))
# Añadir un rectángulo
rect = Rectangle((2, -0.5), 3, 1, fill=True, facecolor='yellow',
alpha=0.3, edgecolor='black', linestyle='-')
ax.add_patch(rect)
# Añadir una e
Lecciones de este módulo de Matplotlib
Lecciones de programación del módulo Personalización de gráficos del curso de Matplotlib.
Ejercicios de programación en este módulo de Matplotlib
Evalúa tus conocimientos en Personalización de gráficos con ejercicios de programación Personalización de gráficos de tipo Test, Puzzle, Código y Proyecto con VSCode.