Trazado con Python Matplotlib: Guía Completa
Aprende a crear y personalizar gráficos de líneas, barras, sectores, dispersión y subgráficos en Python con Matplotlib, con ejemplos claros.
Matplotlib es la biblioteca de visualización de datos más utilizada en Python. Esta guía explica cómo crear los tipos de gráficos más comunes — gráficos de líneas, diagramas de barras, gráficos de sectores, gráficos de dispersión y subgráficos — y cómo personalizarlos con etiquetas, colores, leyendas y controles de diseño. Se asume que ya has instalado Matplotlib y puedes ejecutar scripts de Python localmente.
¿Qué es el trazado con Matplotlib?
El módulo pyplot de Matplotlib proporciona una interfaz de estilo MATLAB que te permite construir gráficos paso a paso: crear una figura, agregar datos, agregar etiquetas y luego mostrar o guardar el resultado. Cada gráfico sigue el mismo patrón:
- Importar
matplotlib.pyplot(convencionalmente comoplt). - Llamar a una función de trazado (
plt.plot(),plt.bar(), etc.) con tus datos. - Llamar a funciones decoradoras para agregar títulos, etiquetas de ejes, leyendas, etc.
- Llamar a
plt.show()para mostrar la figura, oplt.savefig()para escribirla en el disco.
Comprender esta secuencia facilita el cambio entre tipos de gráficos y su combinación en figuras más complejas.
Instalación de Matplotlib
Si aún no has instalado Matplotlib, ejecuta el siguiente comando en tu terminal:
pip install matplotlibVerifica la instalación importándolo:
import matplotlib
print(matplotlib.__version__) # e.g. 3.9.0Crear un gráfico de líneas
Un gráfico de líneas es el tipo de gráfico predeterminado y es ideal para mostrar tendencias a lo largo del tiempo o cualquier secuencia ordenada.
import matplotlib.pyplot as plt
# Data
years = [2015, 2016, 2017, 2018, 2019, 2020]
sales = [100, 150, 200, 250, 300, 350]
# Plot
plt.plot(years, sales)
# Labels and title
plt.xlabel("Year")
plt.ylabel("Sales (units)")
plt.title("Annual Sales")
plt.show()plt.plot(x, y) dibuja una línea continua que conecta cada par (x, y). El eje x muestra los años y el eje y muestra las cifras de ventas, revelando la tendencia ascendente de un vistazo.
Trazar múltiples líneas
Para comparar dos conjuntos de datos en los mismos ejes, llama a plt.plot() dos veces antes de plt.show(). Usa el parámetro label y plt.legend() para identificar cada línea:
import matplotlib.pyplot as plt
years = [2018, 2019, 2020, 2021, 2022]
product_a = [120, 145, 170, 210, 260]
product_b = [90, 115, 140, 165, 195]
plt.plot(years, product_a, label="Product A")
plt.plot(years, product_b, label="Product B")
plt.xlabel("Year")
plt.ylabel("Revenue ($k)")
plt.title("Revenue by Product")
plt.legend()
plt.show()Matplotlib asigna automáticamente colores diferentes a cada serie. Llamar a plt.legend() agrega una clave que relaciona los colores con las etiquetas.
Crear un diagrama de barras
Los diagramas de barras comparan categorías discretas. Usa plt.bar() para barras verticales y plt.barh() para barras horizontales.
import matplotlib.pyplot as plt
countries = ["USA", "China", "Japan", "Germany", "UK"]
gdp = [21.44, 14.14, 5.15, 4.17, 2.62]
plt.bar(countries, gdp, color="steelblue")
plt.xlabel("Country")
plt.ylabel("GDP (USD trillions)")
plt.title("Top 5 Economies by GDP")
plt.show()La altura de cada barra representa el valor del PIB. El parámetro color acepta cualquier color CSS con nombre, cadena hexadecimal o tupla RGB.
Diagramas de barras agrupadas
Cuando necesitas comparar varias categorías una al lado de la otra, desplaza manualmente las posiciones de las barras usando range() y un desplazamiento de anchura:
import matplotlib.pyplot as plt
categories = ["Q1", "Q2", "Q3", "Q4"]
team_a = [30, 45, 38, 52]
team_b = [25, 40, 35, 48]
x = range(len(categories))
width = 0.35
plt.bar([i - width / 2 for i in x], team_a, width=width, label="Team A")
plt.bar([i + width / 2 for i in x], team_b, width=width, label="Team B")
plt.xticks(x, categories)
plt.xlabel("Quarter")
plt.ylabel("Sales")
plt.title("Quarterly Sales by Team")
plt.legend()
plt.show()plt.xticks(x, categories) reemplaza las posiciones numéricas de las marcas por los nombres reales de los trimestres.
Crear un gráfico de sectores
Los gráficos de sectores muestran cómo las partes componen un todo. Úsalos con moderación — funcionan mejor con cinco o menos sectores que sumen el 100 %.
import matplotlib.pyplot as plt
brands = ["Samsung", "Apple", "Huawei", "Xiaomi", "Others"]
market_share = [19.2, 15.9, 14.6, 10.2, 40.1]
plt.pie(
market_share,
labels=brands,
autopct="%1.1f%%", # show percentage inside each slice
startangle=90, # rotate so the first slice starts at the top
)
plt.title("Smartphone Market Share")
plt.show()autopct="%1.1f%%"imprime el porcentaje con un decimal dentro de cada sector.startangle=90rota el gráfico para que el primer sector comience a las 12 en punto, lo que facilita su lectura.
Nota: Las cifras de cuota de mercado anteriores son aproximadas y se utilizan aquí solo a modo ilustrativo.
Crear un gráfico de dispersión
Los gráficos de dispersión revelan la relación entre dos variables continuas. Cada punto representa una observación.
import matplotlib.pyplot as plt
hours_studied = [1, 2, 3, 4, 5, 6, 7, 8]
exam_scores = [45, 52, 60, 65, 72, 78, 85, 90]
plt.scatter(hours_studied, exam_scores, color="coral", edgecolors="black", s=80)
plt.xlabel("Hours Studied")
plt.ylabel("Exam Score")
plt.title("Study Time vs. Exam Score")
plt.show()El parámetro s controla el tamaño del marcador en puntos al cuadrado. edgecolors="black" agrega un contorno a cada punto, lo que facilita distinguirlos cuando se superponen.
Para un análisis más detallado, consulta el capítulo Gráfico de Dispersión con Matplotlib.
Personalizar la apariencia del gráfico
Matplotlib ofrece un control detallado sobre prácticamente cada elemento visual.
Colores, marcadores y estilos de línea
Pasa una cadena de formato como tercer argumento a plt.plot() para establecer el estilo del marcador, el estilo de línea y el color en un solo paso:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.plot(x, y, "ro--") # red circles, dashed line
plt.xlabel("x")
plt.ylabel("y")
plt.title("Custom Style")
plt.show()La cadena de formato "ro--" combina:
r— color rojoo— marcador circular--— línea discontinua
Códigos comunes de cadena de formato:
| Código | Significado | Código | Significado |
|---|---|---|---|
b | azul | - | línea continua |
g | verde | -- | línea discontinua |
r | rojo | -. | línea de puntos y guiones |
k | negro | : | línea punteada |
o | círculo | s | cuadrado |
^ | triángulo arriba | * | estrella |
También puedes pasar argumentos de palabra clave para mayor control:
plt.plot(x, y, color="#2196f3", linewidth=2, linestyle="--", marker="o", markersize=8)Tamaño de figura y DPI
Establece las dimensiones de la figura (en pulgadas) antes de trazar llamando a plt.figure():
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5), dpi=100) # 1000×500 pixels
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
plt.plot(x, y)
plt.title("Wide Figure")
plt.show()figsize=(width, height) toma valores en pulgadas. dpi (puntos por pulgada) controla la densidad de píxeles — 100 dpi es adecuado para pantalla; 300 dpi es lo habitual para impresión.
Agregar una cuadrícula
Una cuadrícula facilita la lectura de valores:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [3, 7, 2, 9, 4]
plt.plot(x, y, marker="o")
plt.grid(True, linestyle="--", alpha=0.7)
plt.title("Plot with Grid")
plt.show()alpha=0.7 hace que las líneas de la cuadrícula sean semitransparentes para que no oculten los datos. Consulta el capítulo Cuadrícula de Matplotlib para más opciones.
Crear subgráficos
Los subgráficos te permiten mostrar múltiples gráficos en una sola figura, lo que resulta útil para comparar diferentes perspectivas del mismo conjunto de datos.
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 4, 9, 16, 25]
y3 = [5, 3, 7, 2, 8]
y4 = [10, 7, 4, 5, 6]
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
axes[0][0].plot(x, y1, "b-o")
axes[0][0].set_title("Linear")
axes[0][1].plot(x, y2, "r--s")
axes[0][1].set_title("Quadratic")
axes[1][0].bar(x, y3, color="green")
axes[1][0].set_title("Bar Chart")
axes[1][1].scatter(x, y4, color="purple", s=80)
axes[1][1].set_title("Scatter")
plt.tight_layout() # prevent overlapping labels
plt.show()plt.subplots(rows, cols) devuelve un objeto Figure y un array bidimensional de objetos Axes. Trabajar con objetos Axes individuales (por ejemplo, axes[0][0].plot(...)) es el enfoque preferido para diseños con múltiples gráficos, ya que brinda control independiente sobre cada panel. plt.tight_layout() ajusta automáticamente el espaciado para que los títulos y etiquetas no se superpongan.
Consulta el capítulo Subgráficos de Matplotlib para opciones de diseño avanzadas.
Guardar un gráfico en un archivo
plt.savefig() escribe la figura actual en el disco. Infiere el formato del archivo a partir de la extensión:
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.plot(x, y, marker="o")
plt.title("Saved Plot")
plt.savefig("my_plot.png", dpi=150, bbox_inches="tight")- Los formatos compatibles incluyen
.png,.jpg,.svgy.pdf. bbox_inches="tight"recorta el espacio en blanco alrededor de la figura para que no se pierda nada.- Siempre llama a
plt.savefig()antes deplt.show()—plt.show()borra el estado de la figura.
Errores comunes
plt.show() borra la figura. Si llamas a plt.savefig() después de plt.show(), guardarás una imagen en blanco. Guarda siempre primero y muestra después.
Ejecución en entornos no interactivos. En scripts, plt.show() abre una ventana de interfaz gráfica y bloquea la ejecución hasta que se cierra. En cuadernos Jupyter, usa %matplotlib inline al inicio para que los gráficos se rendericen en línea. En servidores sin cabecera (CI, Docker), cambia a un backend no interactivo: import matplotlib; matplotlib.use("Agg") antes de importar pyplot.
Olvidar cerrar figuras. Cada llamada a plt.figure() abre una nueva figura en memoria. En bucles que generan muchos gráficos, cierra cada uno con plt.close() para evitar el agotamiento de memoria.
import matplotlib.pyplot as plt
for i in range(10):
plt.plot([1, 2, 3], [i, i * 2, i * 3])
plt.savefig(f"plot_{i}.png")
plt.close() # release memorySubgráficos superpuestos. Llamar a plt.tight_layout() o plt.subplots_adjust() después de crear todos los subgráficos corrige los títulos y etiquetas de marcas superpuestos.
Resumen
| Tipo de gráfico | Función | Mejor uso |
|---|---|---|
| Gráfico de líneas | plt.plot() | Tendencias en datos ordenados |
| Diagrama de barras | plt.bar() / plt.barh() | Comparar categorías discretas |
| Gráfico de sectores | plt.pie() | Composición parte-todo |
| Gráfico de dispersión | plt.scatter() | Relación entre dos variables |
| Subgráficos | plt.subplots() | Múltiples gráficos en una figura |
Capítulos relacionados
- Introducción a Matplotlib — descripción general de la biblioteca y sus componentes
- Primeros pasos con Matplotlib — instalación y tu primer gráfico
- Gráficos de Líneas con Matplotlib — estilos de línea, marcadores y gráficos de múltiples series en profundidad
- Diagramas de Barras con Matplotlib — barras verticales, horizontales y apiladas
- Gráficos de Sectores con Matplotlib — sectores desplegados, colores personalizados y gráficos de rosquilla
- Histogramas con Matplotlib — gráficos de distribución y control de intervalos
- Gráfico de Dispersión con Matplotlib — gráficos de burbujas y dispersión con mapa de colores
- Subgráficos con Matplotlib — diseños avanzados de múltiples paneles
- Etiquetas con Matplotlib — títulos, etiquetas de ejes, anotaciones y texto
- Cuadrícula de Matplotlib — líneas de cuadrícula y personalización de marcas
- Marcadores de Matplotlib — estilos, tamaños y colores de borde de marcadores