W3docs

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:

  1. Importar matplotlib.pyplot (convencionalmente como plt).
  2. Llamar a una función de trazado (plt.plot(), plt.bar(), etc.) con tus datos.
  3. Llamar a funciones decoradoras para agregar títulos, etiquetas de ejes, leyendas, etc.
  4. Llamar a plt.show() para mostrar la figura, o plt.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 matplotlib

Verifica la instalación importándolo:

import matplotlib
print(matplotlib.__version__)  # e.g. 3.9.0

Crear 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=90 rota 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 rojo
  • o — marcador circular
  • -- — línea discontinua

Códigos comunes de cadena de formato:

CódigoSignificadoCódigoSignificado
bazul-línea continua
gverde--línea discontinua
rrojo-.línea de puntos y guiones
knegro:línea punteada
ocírculoscuadrado
^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, .svg y .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 de plt.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 memory

Subgrá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áficoFunciónMejor uso
Gráfico de líneasplt.plot()Tendencias en datos ordenados
Diagrama de barrasplt.bar() / plt.barh()Comparar categorías discretas
Gráfico de sectoresplt.pie()Composición parte-todo
Gráfico de dispersiónplt.scatter()Relación entre dos variables
Subgráficosplt.subplots()Múltiples gráficos en una figura

Capítulos relacionados

Was this page helpful?