Saltar al contenido

# graficos-en-matplotlib

Gráficos en Matplotlib

Volver a la portada del curso
Lectura (Markdown)

Conceptos Básicos de Matplotlib

Sección 1 · Introducción a Matplotlib

Conceptos Básicos de Matplotlib

PyShop vendió 10.93 millones de MXN en 2025, repartidos en 6000 pedidos. Una tabla con los doce meses dice cuánto, pero no deja ver de un vistazo que febrero fue el mes más bajo (0.61 M) y que noviembre y diciembre se despegan del resto (1.36 M y 1.50 M). Para eso sirve un gráfico. Antes de dibujar el primero conviene conocer las piezas con las que Matplotlib arma cualquier figura y las dos formas de darle instrucciones. Con ese vocabulario, la documentación y los mensajes de error se vuelven fáciles de leer.

1. Anatomía de una figura

Todo gráfico de Matplotlib es un árbol de objetos. Los cuatro que aparecen siempre son estos:

ObjetoQué esEjemplo en PyShop
Figureel lienzo completo: contiene uno o varios ejes, el título general y la leyenda de la figurala imagen de 640 × 480 píxeles que se guarda como PNG
Axesun área de dibujo con sus datos, título y etiquetas; una figura puede tener variosel panel con la línea del ingreso mensual
Axiscada eje numérico de un Axes (x e y): decide la escala, los límites, las marcas (ticks) y sus etiquetasel eje x con los meses 1 a 12
Artistcualquier cosa visible: líneas, textos, barras, la leyenda, los bordesla línea Line2D del ingreso

Ojo con la palabra Axes: no es el plural de Axis. Un Axes es el panel completo y contiene dos objetos Axis. Los cuatro bordes del panel se llaman spines (left, right, bottom y top) y se pueden ocultar uno por uno. La figura por defecto mide 6.4 × 4.8 pulgadas a 100 puntos por pulgada, es decir, 640 × 480 píxeles.

2. Dos interfaces: pyplot y orientada a objetos

Matplotlib ofrece dos formas de escribir el mismo gráfico. La interfaz pyplot usa funciones como plt.plot y plt.title, que actúan sobre «la figura y los ejes actuales», un estado oculto que Matplotlib recuerda por ti. La interfaz orientada a objetos (OO) crea la figura y los ejes de forma explícita y llama a sus métodos:

import matplotlib.pyplot as plt

ventas = generar_ventas()
mensual = ventas.groupby(ventas["fecha"].dt.month)["total"].sum() / 1e6

# pyplot: el estado está implícito
plt.plot(mensual.index, mensual.values)
plt.title("Ingreso mensual 2025")

# orientada a objetos: figura y ejes con nombre
fig, ax = plt.subplots()
ax.plot(mensual.index, mensual.values, marker="o")
ax.set_title("Ingreso mensual 2025")
print(type(fig).__name__, type(ax).__name__)  # Figure Axes

La guía oficial de Matplotlib recomienda el estilo OO para gráficos complejos, funciones reutilizables y proyectos grandes, y deja pyplot para pruebas rápidas. Este curso usa siempre fig, ax = plt.subplots(): cuando hay dos o más paneles, el estado implícito obliga a recordar cuál está «activo», y con nombres explícitos (ax_mes, ax_cat) no hay duda de dónde cae cada línea. La traducción entre ambos estilos es casi mecánica: plt.title pasa a ax.set_title, plt.xlabel a ax.set_xlabel y plt.xlim a ax.set_xlim.

3. plt.subplots(filas, columnas)

Sin argumentos, plt.subplots() devuelve una figura y un solo Axes. Con filas y columnas devuelve un arreglo de NumPy con un Axes por celda, que se indexa como cualquier arreglo:

fig, axs = plt.subplots(2, 2, figsize=(10, 6))
print(axs.shape)        # (2, 2)
axs[0, 0].plot(mensual.index, mensual.values)
axs[0, 0].set_title("Ingreso mensual")

fig, axs = plt.subplots(1, 3)
print(axs.shape)        # (3,)

Con una sola fila o una sola columna el arreglo es de una dimensión: se escribe axs[1], no axs[0, 1]. El argumento figsize fija el tamaño en pulgadas.

4. Los métodos ax.set_*

Casi toda la personalización de un panel pasa por métodos del Axes que empiezan con set_, y cada uno tiene su get_ para consultar el valor actual:

  • set_title, set_xlabel, set_ylabel: textos del panel.
  • set_xlim, set_ylim: límites de los ejes (lección «Manipulación de Ejes y Límites»).
  • set_xticks: dónde van las marcas y, con labels=, qué texto llevan.
  • ax.set(...): varias propiedades en una sola llamada.
fig, ax = plt.subplots()
ax.plot(mensual.index, mensual.values, marker="o", label="Ingreso")
ax.set(title="PyShop 2025", xlabel="Mes", ylabel="Millones MXN")
ax.legend()
print(ax.get_title(), "|", ax.get_xlabel())  # PyShop 2025 | Mes
print(fig.get_size_inches(), fig.dpi)        # [6.4 4.8] 100.0

La leyenda toma el texto del argumento label de cada serie; si ninguna serie tiene label, ax.legend() avisa que no hay nada que mostrar.

Trampas comunes

  • Mezclar estilos. Llamar plt.title después de crear varios ejes con subplots pone el título en el último panel creado, no en el que se pensaba.
  • Confundir Axes con Axis. ax es el panel; ax.xaxis es su eje x.
  • Indexar mal el arreglo. plt.subplots(1, 3) da forma (3,): axs[0, 1] lanza un error de índice.
  • Buscar ax.title(). En la interfaz OO el método es ax.set_title().
  • Olvidar el label. Sin él, la leyenda queda vacía.

Cierre

El notebook primer-grafico recorre esta anatomía con las ventas de PyShop: crea la figura, inspecciona sus objetos, dibuja la línea mensual y las barras por categoría y guarda el primer PNG. Cada vez que escribas un gráfico, empieza con fig, ax = plt.subplots() y piensa qué Artist agregas a qué Axes.

Recursos