Data Visualization con pandas y matplotlib

Patricia Carmona
Ironhack
Published in
6 min readApr 16, 2020
Photo by Michael Payne on Unsplash

Momento de probar hipótesis, indagar más en la relación entre las series del DataFrame o de resumir y mostrar el resultado del análisis. Y para ello, nada como una visualización de los resultados en unos gráficos.

Aunque pandas dispone de algunos métodos para visualización, lo cierto es que son muy básicos. Pero hay disponibles diferentes librerías que permiten la personalización de los aspectos que configuran un gráfico para potenciar mucho la representación de los datos.

matplotlib es una de estas librerías y permite la customización de los aspectos del gráfico que quieras adaptar, para representar de la mejor forma los insights de los datos.

Para conocer las posibilidades de la librerías, trabajo con un set de datos de Kaggle sobre Food Preferences, por si te apetece ponerlo en práctica. Es un set de datos muy usable, por lo que puedes ponerte manos a la obra en cuanto lo importes.

Primeros pasos

El primer paso es conocer el DataFrame con unos métodos básicos. En el post inicial de Data Visualization con pandas te cuento cómo preparar este DataFrame.

matplotlib

La librería matplolib fue una de las primeras que se desarrollaron para visualización con Python y es clave para trabajar con otras librerías más avanzadas como seaborn.

La clave de matplotlib está en cómo estructura la visualización. Y puede utilizarse de dos formas:

  1. Opción 1. Creando una figura que representa al gráfico, indicando el número de Axes y después, mostrando la figura. Esto se conoce como Object-oriented style.
  2. Opción 2. Dejando que sea la propia librería la que configure el gráfico automáticamente.
import matplotlib.pyplot as pltplt.style.use("bmh")            #Declaración del estilo#Opción 1
fig, ax = plt.subplots() #Creación de una figura con un axis
#Opción 2
plt.plot() #Creación de una gráfica de línea

La guía de estilos de matplotlib también es de mucha ayuda, ya que permite configurar diferentes estilos de visualización.

Generando un gráfico básico

En matplotlib hay dos formas para generar una visualización. En cualquiera de los dos casos, hay que generar los valores de la variable independiente ‘x’ (x_values) y los valores de la variable dependiente ‘y’ (y_values).

En primer lugar, genero un gráfico con la opción más sencilla, siguiendo este formato:

librería + tipo de gráfico + (valores de x, valores de y)

x_values = df['Food'].unique()
y_values = df['Food'].value_counts().tolist()
plt.bar(x_values, y_values)
plt.show()
plt.close('all')
Gráfico que representa el número de comidas de cada tipo

Te recomiendo incluir:

plt.show()                      #Mostrar la figura
plt.savefig(nombre.formato) # (Opcional) Guardar la figura
plt.close('all') #Cerrar

De esta forma es muy sencillo generar un gráfico, pero la librería genera uno estándar sin configurar el eje x o y, sin incluir nombres, sin etiquetas y sin personalización, que al fin y al cabo es lo que permite que un gráfico potencie la información que se quiere representar.

Personalizar cada gráfico

Para generar un gráfico con matplotlib que represente mejor visualmente todo el potencial de los datos, necesitamos estructurar el gráfico en diferentes partes. El gráfico está formado por:

  • La figura
  • El área del gráfico. Dentro de una figura puede haber más de un gráfico
  • El tipo de representación: línea, barras, histograma, scatter o tarta, entre otros.
  • El eje x
  • El eje y
  • La etiqueta del eje x
  • La etiqueta del eje y
  • El título del gráfico
  • La leyenda

A continuación voy a desarrollar un gráfico de barras con la primera opción, desarrollando y customizando la figura y el gráfico. Voy a visulizar un resumen de pedidos de postres (serie Dessert).

Datos

x_values = df.Dessert.unique()
y_values = df.Dessert.value_counts().tolist()

Configuración de la figura y el gráfico

Para diseñar la figura y el gráfico pueden configurarse individualmente todos los aspectos descritos más arriba:

plt.figure()    #Figura. Puede incluirse el tamaño con figsizeplt.bar(x_values, y_values)          #El gráfico
plt.title('Pedidos de postres') #El título
ax = plt.subplot() #Axis
ax.set_xticks(x_values) #Eje x
ax.set_xticklabels(x_values) #Etiquetas del eje x
ax.set_xlabel('Petición de postre') #Nombre del eje x
ax.set_ylabel('Volumen de peticiones') #Nombre del eje y
Gráfico de postres

El generar subplots permite visualizar en el mismo eje diferentes gráficos. Este método se configura indicando el número de filas, número de columnas y el índice que ocupa cada gráfico.

Puede subplotearse una figura para el tipo de comida, el tipo de bebida y el tipo postre y se visualizaría de la siguiente forma:

Para la primera figura el código incluye en subplot (1, 3, 1). Se dibuja 1 fila, 3 columnas y el gráfico en la posición 1. Tienes todo el código de este desarrollo en el repositorio del proyecto.

plt.figure()                                #Figura 
x_values1 = df.Food.unique()
y_values1 = df.Food.value_counts().tolist()
ax = plt.subplot(1, 3, 1) #Axis
plt.bar(x_values1, y_values1) #El gráfico
plt.title('Pedidos de comida') #El título
ax.set_xticks(x_values1) #Eje x
ax.set_xticklabels(x_values1, rotation=60) #Etiquetas del eje x
ax.set_xlabel('Tipos de comida') #Nombre del eje x
ax.set_ylabel('Volumen de peticiones') #Nombre del eje y

Desplegando el potencial de cada gráfico

matplotlib dispone de diferentes métodos que permiten personalizar cada uno de los aspectos de cada gráfico. La documentación recoge todas las posibilidades que ofrece, solo por mostrar algunas de las más utilizadas, a continuación muestro la configuración de color, estilo, marcador, anotaciones y fuente.

En el siguiente gráfico despliego el volumen de pedidos por día de la semana y el volumen de pedidos de ‘Traditional food’ y ‘Western food’ por día.

Datos de día de la semana y volúmenes de pedidos

x_values2 = ['Martes', 'Miércoles', 'Jueves', 'Viernes']y_values2 = df['Day'].value_counts().tolist()y_values3 = df[(df['Food'] == 'Traditional food')]['Day'].value_counts().tolist()y_values4 = df[(df['Food'] == 'Western Food')]['Day'].value_counts().tolist()

Configuración de la fuente y los colores de la figura

plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = 'Tahoma'
plt.rcParams['xtick.color']='#A8A8A9'
plt.rcParams['ytick.color']='#A8A8A9'

Para la personalización del gráfico de línea, incluyo los parámetros color (string o hexadecimal), linestyle y marker:

plt.plot(x_values2, y_values2, color='#a12424', linestyle='--', marker='o')

Para la leyenda, utilizo la etiqueta loc que pertime cambiar la posición:

plt.legend(['Traditional food', 'Western food'], loc=1)

Para las anotaciones de cada uno de los puntos:

for i, txt in enumerate(y_values2):
ax.annotate(txt, (x_values2[i], y_values2[i]))

Y para controlar el espacio entre gráficos:

plt.subplots_adjust(wspace=0.85, bottom=0.3)

De esta forma puedes tener un gráfico con más personalidad y adaptado a las necesidades visuales. Con la primera opción se genera automáticamente el primer gráfico y con la segunda, desarrollo el segundo, que representa gráficamente mucho mejor los volúmenes de pedidos.

Gráfico sin personalizar
Gráfico personalizado

En el repositorio de este proyecto puedes encontrar algunos gráficos más como la comparativa de pedidos por edad o un histograma de análisis de edades y el código completo del desarrollo. ¡Seguimos!

Más info por si quieres profundizar

Y si te apetece conocer un poco más, te dejo algunos artículos de referencia para visualización con matplolib:

  1. Matplotlib a fondo. Configuración avanzada de diferentes tipos de gráficos.
  2. Visualización avanzada con matplotlib.
  3. Potenciar la visualización de matplotlib con sencillos trucos.
  4. Python gallery. En esta galería puedes encontrar cómo desarrollar cada gráfico en la librería que mejor lo visualiza.

--

--

Patricia Carmona
Ironhack

Data Analyst. Improving the relation brands-users.