12.2 Integración de Pandas con Matplotlib.

El objeto Dataframe tiene métodos asociados con el módulo Matplotlib, permitiendo aplicar todo lo presentado sobre éste.

from pandas import DataFrame
import matplotlib.pyplot as plt

limite_inferior = [0, 1, 2, 3]
valor = [1, 2, 3, 4]
limite_superior = [2, 3, 4, 5]
d = {'Limite inferior': limite_inferior,
     'Valor': valor, 
     'Limite superior': limite_superior}
df = DataFrame(data = d)
ax = df.plot(color=["Blue", "Red", "Blue"])
lines, labels = ax.get_legend_handles_labels()
_ = ax.legend([lines[0], lines[1]], ["Límites", "Valor"])

Para ver los métodos “plot” del objeto data frame, ver https://pandas.pydata.org/pandas-docs/version/0.25.0/reference/frame.html#plotting

Ejemplo

import pandas as pd
df = pd.read_csv("../Datos/saber11_2019.csv", sep=";")
# print(df.shape)
# df.head()
df['ESTU_GENERO'].value_counts().sort_values().plot(kind = 'bar', color = ['cornflowerblue', 'indianred'])

Ejercicio

Despliegue un gráfico de barras que exponga el número de individuos que presentaron la Prueba Saber 11 por departamento. Sólo resalte los cinco departamentos con más estudiantes.

La importancia de manipular los conjuntos de datos para la visualización es la necesidad de estructurarlos de la manera adecuada a la necesidad de cada algoritmo en particular.

import matplotlib.pyplot as plt
_ = plt.figure(figsize=(6,3))
ax = df['ESTU_GENERO'].value_counts().sort_values().plot(kind = 'bar', color = ['darkkhaki', 'darkgoldenrod'])
_ = ax.set_title("Prueba SABER 11")
_ = ax.set_xlabel('Sexo')
_ = ax.set_ylabel('Número de estudiantes')
_ = plt.xticks(rotation=0)

En el siguiente código se calcula la cantidad de hombres y mujeres por naturaleza del colegio con la intención de mostrar barras agrupadas. Una opción es indicar que hay subplots, sin especificar el número de ejes. Al definir dos ejes, queda claro. En cada eje se añade el atributo del tipo de canal que se pretende utilizar.

import numpy as np
import matplotlib.pyplot as plt
etiquetas = ["Oficial", "No Oficial"]
hombres = df[df["ESTU_GENERO"] == "M"]["COLE_NATURALEZA"].value_counts()
mujeres = df[df["ESTU_GENERO"] == "F"]["COLE_NATURALEZA"].value_counts()
ancho = 0.2
indice = np.arange(2)
fig, eje = plt.subplots()
barra1 = eje.bar(indice, hombres, ancho, color = "cornflowerblue")
barra2 = eje.bar(indice + ancho, mujeres, ancho, color = "mediumseagreen", tick_label = etiquetas)
plt.ylabel("Cantidad")
## Text(0, 0.5, 'Cantidad')
plt.legend((barra1[0], barra2[0]), ("Hombres", "Mujeres"))
## <matplotlib.legend.Legend object at 0x0000012D8A5EBE20>
plt.tight_layout()  # Ajusta la disposición para el mejor espaciado posible.

Para realizar el mismo gráfico con barras apiladas basta con alterar el argumento de la barra2, añadiendo ‘bottom = hombres’ y ajustando el indice correspondiente. No obstante, es más interesante comparar por sexo, así que se invierte el orden de ambas variables categóricas:

etiquetas = ["Mujeres", "Hombres"]
oficiales = df[df["COLE_NATURALEZA"] == "OFICIAL"]["ESTU_GENERO"].value_counts()
noOficiales = df[df["COLE_NATURALEZA"] == "NO OFICIAL"]["ESTU_GENERO"].value_counts()

ancho = 0.2
indice = np.arange(2)
fig, eje = plt.subplots()
barra1 = eje.bar(indice, oficiales, ancho, color = "#FF7C33")
barra2 = eje.bar(indice, noOficiales, ancho, bottom = oficiales, color = "#0C9999", tick_label = etiquetas)
plt.ylabel("Cantidad")
## Text(0, 0.5, 'Cantidad')
plt.legend((barra1[0], barra2[0]), ("Oficial", "No Oficial"))
## <matplotlib.legend.Legend object at 0x0000012D8A647FD0>
plt.tight_layout()  # Ajusta la disposición para el mejor espaciado posible.

Obsérvese que se cambian los colores para dejar claro que se ha intercambiado la agrupación de las barras.

Mosaico

Es una alternativa para presentar simultáneamente dos variables categóricas.

from statsmodels.graphics.mosaicplot import mosaic
plt.rcParams['font.size'] = 10.0
mosaic(df, ['COLE_NATURALEZA', 'ESTU_GENERO'])
## (<Figure size 700x500 with 3 Axes>, {('OFICIAL', 'M'): (0.0, 0.0, 0.755575319877256, 0.44408956591422694), ('OFICIAL', 'F'): (0.0, 0.4474118250504396, 0.755575319877256, 0.5525881749495605), ('NO OFICIAL', 'M'): (0.7605504442553654, 0.0, 0.2394495557446346, 0.49458454822104536), ('NO OFICIAL', 'F'): (0.7605504442553654, 0.497906807357258, 0.2394495557446346, 0.5020931926427419)})

Otras Gráficas

Hay otros estilos de gráficas disponibles por medio del argumento kind en el método plot(). La lista completa:

Sobre variables categóricas:

  • bar para barras verticales.
  • barh para barras horizontales.
  • pie para diagramas de sectores.

Sobre variables cuantitativas continuas:

  • hist para histogramas
  • box para diagramas de caja.
  • kde o density para diagramas de densidad.

Para series de tiempo sobre variables cuantitativas continuas:

  • line para diagramas de línea.
  • area para diagramas de área.

Sobre pares de variables cuantitativas continuas:

  • scatter para diagramas de dispersión.
  • hexbin para diagramas de dispersión hexágonales.