Pensamiento Computacional · Unidad 6 — Bibliotecas de Python
Gráficos con Matplotlib
Un gráfico es la forma más rápida de entender un conjunto de datos. Con tres líneas ya tenés uno, pero sin títulos no sirve de nada.
La explicación
El gráfico mínimo
x = [1, 2, 3, 4]
y = [1, 4, 9, 16]
plt.plot(x, y)
plt.show()
El as plt es la convención, igual que np y pd.
plot dibuja y show muestra. Sin show(), en muchos
entornos no aparece nada.
x con su y. Si una tiene 4 y la otra 5, Python corta recién al dibujar, con
ValueError: x and y must have same first dimension, así que conviene chequearlo antes con len().
Tipos de gráfico
plt.bar(x, y) barras comparar categorías
plt.scatter(x, y) puntos ver si dos variables se relacionan
plt.hist(datos) histograma cómo se reparten los valores
plt.pie(valores) torta partes de un mismo total
Elegir bien importa: un gráfico de líneas entre categorías que no tienen orden sugiere una continuidad que no existe.
La torta: partes de un total
horas = [8, 6, 3, 4, 3]
usos = ["Dormir", "Cursar", "Viajar", "Estudiar", "Otras"]
plt.pie(horas, labels=usos, autopct="%1.1f%%")
plt.title("Un día de cursada (24 horas)")
plt.show()
plt.pie recibe los valores de cada porción y, con labels, el nombre de
cada una, en el mismo orden. No hace falta que sumen 100: matplotlib
calcula solo qué parte del total es cada valor. autopct="%1.1f%%" escribe ese
porcentaje adentro de cada porción, con un decimal: 8 de 24 horas es 33.3%, 6 de 24 es 25.0%.
Sin títulos no se entiende
plt.title("Notas por parcial")
plt.xlabel("Parcial")
plt.ylabel("Nota")
plt.show()
Varias series
plt.plot(x, y2, label="Curso B")
plt.legend() # sin esto los label no se ven
plt.show()
Cada plot antes del show se dibuja sobre el mismo gráfico. El
legend() es el que hace aparecer la referencia.
Juntando todo
plt.bar(df["nombre"], df["nota"])
plt.title("Notas del curso")
plt.ylabel("Nota")
plt.show()
Leer con Pandas y graficar con Matplotlib es la combinación estándar, y es a donde apunta toda la unidad: de un archivo de datos a una conclusión que se ve.
Con un CSV de notas (columnas nombre y nota), hacer un gráfico de barras presentable.
import matplotlib.pyplot as plt
df = pd.read_csv("notas.csv")
plt.bar(df["nombre"], df["nota"])
plt.title("Notas del curso")
plt.xlabel("Estudiante")
plt.ylabel("Nota")
plt.ylim(0, 10)
plt.show()
Por qué barras y no líneas. Los nombres son categorías, no una secuencia. Una línea entre ana, luis y sol sugeriría que hay una evolución entre ellos, y no la hay.
Por qué ylim(0, 10). Sin eso, Matplotlib ajusta el eje al rango de los
datos. Si todas las notas están entre 7 y 9, el eje arranca en 7 y las diferencias se ven
enormes. Fijar la escala real de las notas evita exagerar sin querer.
Control antes de entregar: ¿tiene título? ¿los dos ejes están etiquetados? ¿se entiende sin que nadie te lo explique? Si la respuesta a las tres es sí, está listo.
Con el mismo CSV de ventas, hacer un gráfico de líneas de la facturación mensual. Explicar por qué el orden que sale por defecto arruina el gráfico y cómo se arregla.
El problema aparece antes de dibujar nada. groupby ordena los grupos alfabéticamente, y los meses en castellano no están en orden alfabético:
orden real: enero, febrero, marzo, abril, mayo, …
Con dos meses no se nota —enero y febrero están alfabéticamente en orden— pero apenas aparece abril el gráfico queda al revés:
→ ['abril', 'enero', 'febrero'] abril primero
En un gráfico de líneas eso es grave, porque la línea une los puntos en el orden en que están. Con los meses desordenados, la línea sube y baja mostrando una evolución que no existe. Un gráfico de barras al menos se lee mal; uno de líneas directamente miente.
La solución: decir cuál es el orden bueno y reindexar.
"julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"]
serie = df.groupby("mes")["monto"].sum()
serie = serie.reindex([m for m in ORDEN if m in serie.index])
El if m in serie.index es para que no aparezcan meses sin datos. Sin eso, reindex los agrega con valor NaN y quedan diez huecos en el gráfico.
Ahora sí, el gráfico:
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(serie.index, serie.values, marker="o", linewidth=2)
ax.set_title("Facturacion por mes")
ax.set_ylabel("Pesos")
ax.set_ylim(bottom=0)
ax.grid(alpha=0.3)
fig.tight_layout()
Cada línea de ese bloque hace algo que se nota:
marker="o" → se ve dónde hay dato de verdad y dónde es interpolación
linewidth=2 → la línea por defecto es muy finita en pantalla
set_ylim(bottom=0) → el eje arranca en cero
grid(alpha=0.3) → se puede leer un valor sin ir hasta el eje
tight_layout() → que no se corten las etiquetas
El set_ylim(bottom=0) merece un párrafo aparte. Por defecto matplotlib ajusta el eje al rango de los datos, así que una variación de 3900 a 4900 ocupa todo el alto y parece un derrumbe. Con el eje desde cero, la caída se ve como lo que es: un 20 %.
Lo que NO hay que hacer: elegir colores a mano uno por uno, poner leyenda cuando hay una sola serie, o usar 3D. Los colores por defecto de matplotlib están elegidos para distinguirse bien en pantalla.
Guardarlo, que es lo que pide un TP:
plt.close(fig)
dpi=110 o más, porque el valor por defecto (100) se ve borroso en pantallas modernas. Y plt.close(fig) libera la figura: sin eso, un ciclo que genera veinte gráficos se come la memoria.
El título dice qué se está mirando, no qué tipo de gráfico es. "Facturación por mes" sirve; "Gráfico de líneas" no aporta nada que no se vea.
El control final, que siempre conviene hacer: los valores del gráfico tienen que coincidir con los del groupby. Enero 4900 y febrero 3900, y el reindexado no los cambió: solo los puso en orden ✓.
Dónde se pierde el punto: entregar el gráfico con los meses en orden alfabético. El código corre, la imagen sale, y el gráfico dice algo falso — que es peor que no entregarlo.
Dónde se cae la mayoría
- Olvidar plt.show() y que no aparezca nada, sin ningún mensaje de error.
- Entregar un gráfico sin título ni etiquetas de ejes.
- Pasar dos listas de distinto largo a plot: cada x necesita su y.
- Usar una torta para valores que no son partes de un mismo total: ahí corresponden las barras.
Hasta acá la explicación. La práctica es la otra mitad: 7 ejercicios de este tema, en cuatro niveles, que no te dicen sólo si está bien al final sino que te corrigen en cada paso y te explican por qué. Además trae una animación que muestra la idea en movimiento.
Practicar Gráficos con Matplotlib →Dónde entra este tema en el parcial
- Segundo parcial — La tabla de aprobados20 puntos · resuelto paso a paso
Los otros temas de la unidad 6
Bibliotecas de Python