# graficos-en-matplotlib
Gráficos en Matplotlib
Volver a la portada del cursoConceptos 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:
| Objeto | Qué es | Ejemplo en PyShop |
|---|---|---|
Figure | el lienzo completo: contiene uno o varios ejes, el título general y la leyenda de la figura | la imagen de 640 × 480 píxeles que se guarda como PNG |
Axes | un área de dibujo con sus datos, título y etiquetas; una figura puede tener varios | el panel con la línea del ingreso mensual |
Axis | cada eje numérico de un Axes (x e y): decide la escala, los límites, las marcas (ticks) y sus etiquetas | el eje x con los meses 1 a 12 |
Artist | cualquier cosa visible: líneas, textos, barras, la leyenda, los bordes | la 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, conlabels=, 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.titledespués de crear varios ejes consubplotspone el título en el último panel creado, no en el que se pensaba. - Confundir
AxesconAxis.axes el panel;ax.xaxises 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 esax.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.