Ir al contenido
wannacode

El primer gráfico

En resumen: Un gráfico en matplotlib es una figure con axes: plot dibuja una línea, bar dibuja barras, y el título, las etiquetas de los ejes y la leyenda dicen qué se muestra.

Problema

«Muéstrame el año»

El gerente quiere ver cómo va el año. Ya sabes calcular los ingresos por mes: las líneas de pedido sin las canceladas, sumadas por mes. El mes son los primeros 7 caracteres de ordered_at, por ejemplo «2026-03»:

Pythondatos: las tablas de la tienda

Los números son correctos, pero en 12 filas es difícil ver qué es un pico y qué es una caída. Diciembre es 15 915,90 € y enero es 7228,20 €. ¿Qué tan grande es la caída comparada con los demás meses? En una tabla el ojo no lo capta. En una línea, enseguida.

La idea

Figure y axes

En la lección «Bienvenida» viste un gráfico hecho con una línea de código. Ahora verás lo que hay detrás.

Un gráfico en matplotlib tiene dos objetos:

  • la figure (Figure) es la hoja entera: el tamaño y el guardado en un archivo;
  • los axes (Axes) son el recuadro con el eje horizontal y el vertical, donde dibujas.

plt.subplots() te da los dos: fig, ax = plt.subplots(). Después dibujas en los axes. ax.plot(x, y) une los puntos con una línea:

Pythondatos: las tablas de la tienda

[gráfico] en el texto de la salida significa que el gráfico no tiene título. La línea ya muestra el pico de diciembre y la bajada posterior. Aún le faltan tres cosas: un título, etiquetas en los ejes y meses que se puedan leer.

Más precisamente, para curiosos

Aquí y en Jupyter el gráfico aparece solo al final de la celda, por eso no hay plt.show(). En un script (python chart.py) lo muestras con plt.show() o lo guardas con fig.savefig('monthly.png'). Si no, el script termina y la figure se va con él.

plt.plot(...) sin fig, ax también dibuja: matplotlib toma entonces los axes «actuales» por sí mismo. Es cómodo para un gráfico rápido, pero con varios axes no sabes cuál es el actual. Por eso aquí siempre dibujas en axes con nombre.

La idea

Título, etiquetas y marcas

Un gráfico sin etiquetas obliga al lector a adivinar. Los axes tienen un método para cada cosa:

  • ax.set_title dice qué estás mirando;
  • ax.set_xlabel y ax.set_ylabel dicen qué hay abajo y qué hay en el lateral;
  • ax.tick_params(axis='x', labelrotation=45) gira las etiquetas de las marcas, los números y nombres debajo del eje, para que no se solapen;
  • fig.tight_layout() organiza la hoja para que las etiquetas giradas no se corten.

marker='o' pone un punto en cada mes:

Pythondatos: las tablas de la tienda

Ahora se ve que 11 meses están entre 7000 € y 10 000 €, y diciembre por encima de 15 000 €. Enero, febrero y septiembre son los más bajos. Por qué baja septiembre lo descubrirás en el proyecto.

Pruébalo

Pedidos por mes

Dibuja el número de pedidos de cada mes (sin los cancelados) como una línea. Guarda los conteos en counts, y pon al gráfico un título y etiquetas en los dos ejes.

Pythondatos: las tablas de la tienda

La idea

Barras: ax.bar

Una línea une puntos y dice «de aquí a aquí algo cambió». Eso tiene sentido para meses que vienen uno tras otro. Las categorías no vienen una tras otra: para ellas dibujas barras (un gráfico de barras) con ax.bar(names, values).

Los ingresos por categoría necesitan el nombre de la categoría en cada línea: producto → category_id → nombre. Dos llamadas a map lo dan:

Pythondatos: las tablas de la tienda

Hay 6 barras, y suman 107 466,20 €. Los ingresos del año son 111 186,20 €. Faltan 3720 €: la tarjeta de regalo no tiene categoría, map le da NaN, y groupby se salta NaN en silencio. El gráfico parece correcto. Por eso cuentas las barras y comparas su suma con los ingresos.

Pruébalo

Todas las categorías

Dibuja los ingresos por categoría de modo que la tarjeta de regalo sea una barra propia. Guarda los ingresos por categoría en by_cat, y añade un título y una etiqueta en el eje vertical.

Pythondatos: las tablas de la tienda

La idea

El atajo: df.plot

Series y DataFrame tienen un método plot. Llama a matplotlib por ti: kind='line' (el valor por defecto), kind='bar' y los otros tipos que vienen en las próximas lecciones. Con ax=ax dibuja en tus axes. Después los terminas con los métodos de los axes, como antes:

Pythondatos: las tablas de la tienda

pandas ha puesto los nombres de las categorías debajo de las barras y los ha girado. También ha puesto una etiqueta abajo: el nombre del índice, category. El título y la etiqueta vertical vienen de tu código.

Las dos maneras dan el mismo gráfico. ax.bar te da control total. df.plot ahorra líneas cuando los datos ya están en una Serie o una tabla.

1. Has ejecutado fig, ax = plt.subplots(). ¿Dónde dibuja monthly.plot(ax=ax)?

La idea

Varias líneas y una leyenda

Diciembre es el pico del año. ¿Crecen igual todas las categorías? Dos líneas en unos mismos axes lo responden. Cada ax.plot añade una línea, label le da un nombre, y ax.legend() añade la leyenda: un recuadro que dice qué línea es cuál:

Pythondatos: las tablas de la tienda

La cocina salta de 964,80 € en noviembre a 3240,60 € en diciembre, 3,4 veces más. Después cae a 592,80 € en enero. La sartén y los cuchillos probablemente se compran como regalo. Los lácteos crecen menos: de 2792,10 € a 3561,20 €.

Una tabla con una columna para cada categoría, df.plot la dibuja de una vez, una línea por columna, con una leyenda a partir de los nombres de las columnas. Por eso la tabla de la lección sobre pivot_table es ancha:

Pythondatos: las tablas de la tienda

Siete líneas en unos mismos axes ya se enredan. Qué gráfico ayuda cuándo, y cómo mostrar muchas series sin enredarlas, es la próxima lección.

Ejercicio

¿Quién sostiene diciembre?

Los dos grandes grupos de categorías son Alimentos y Hogar (parent_id en categories.csv). Dibuja los ingresos de cada uno por mes como dos líneas en unos mismos axes, con leyenda, título y etiquetas en los ejes. Guarda la tabla por mes y grupo en pv.

Pythondatos: las tablas de la tienda

Test

Ponte a prueba

1. ¿Cuál de los dos objetos tiene set_title, set_xlabel y plot?
2. Las etiquetas de los meses debajo del gráfico se solapan. ¿Qué ayuda?
3. Ejecutas el mismo código como archivo chart.py en la terminal y no ves nada. ¿Por qué?
4. La tarjeta de regalo no tiene categoría. ¿Cuántas barras da lines.groupby("category")["revenue"].sum() dibujado con ax.bar?
5. Has dibujado dos líneas con ax.plot(...) y has llamado a ax.legend(), pero la leyenda está vacía. ¿Por qué?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·