Dibujando gráficas con Pandas

Estándar

En esta entrada, veremos la funcionalidad gráfica que nos provee Pandas y cómo mezclarlo con las funciones de Matplotlib.

En la introducción a las librerías de gráficas, mencionamos que Pandas tenía una funcionalidad limitada pero muy útil para dibujar gráficas. Veamos un ejemplo usando datos acerca del consumo de diversos modelos de coche descargados de aquí.
Dado que los datos vienen en millas por galón, en primer lugar haremos la conversión a l/100 km:

In [1]:
import pandas as pd
fedata = pd.read_csv('mpg.csv', index_col=0)
fedata['autovia'] = 235.215/fedata['hwy']
fedata['ciudad'] = 235.215/fedata['cty']

Dibujamos una gráfica de líneas para mostrar el consumo medio por número de cilindros para cada modelo. Para ello, primero agrupamos por el número de cilindros y obtenemos el promedio. El método mean() devuelve un DataFrame sobre el que podemos usar el método loc[] para extraer la media que buscamos. Esta no sería una forma muy eficiente para conjuntos de datos muy grandes, dado que calculamos promedios que no vamos a usar; pero el código para hacerlo bien complicaría mucho esta entrada. Más información acerca de esto aquí.

In [2]:
%matplotlib inline
import matplotlib.pyplot as plt
fedata.groupby('cyl').mean().loc[:,['autovia','ciudad']].plot()
plt.show()

Con esta gráfica podemos concluir que a mayor número de cilindros, mayor consumo. Pero personalmente prefiero tener un coche con 8 cilindros que uno con 5.5. Este gráfico no es del todo correcto porque no hay coches con 5.5 cilindros. Debemos modificarla para tener algo más exacto.

El subsistema gráfico de Pandas está basado en Matplotlib. Según la documentación del método DataFrame.plot(), podemos pasarle argumentos arbitrarios que se pasarán a la función plot() de Matlotlib que lo implementa. Para nosotros, esto significa que podemos tratar los métodos DataFrame.plot() or a Series.plot() como functiones plot() de Matplotlib normales. Por tanto, todo lo que vimos en la entrada anterior puede ser usado aquí.

In [3]:
fedata.groupby('cyl').mean().loc[:,['autovia','ciudad']].plot(linewidth=2, color=['k','r'])

plt.legend(['Autovía','Ciudad'], loc='upper left')
plt.xlabel('Consumo medio por número de cilindros(l/100km)')
plt.axis([3,9,0,20])

ax = plt.axes()
ax.spines['bottom'].set_linewidth(2)
ax.spines['left'].set_linewidth(2)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks(fedata.loc[:,'cyl'].unique())
ax.xaxis.set_ticklabels(fedata.loc[:,'cyl'].unique())
ax.tick_params(labelsize=14)

ax.yaxis.grid(True, which='major')
ax.xaxis.grid(True, which='major')

plt.show()

El único elemento nuevo en este código está en las líneas 15 y 16, en las que hemos usado el método unique() para extraer los distintos números de cilindros disponibles en los datos.

Seguiremos dibujando gráficas para ver las posibilidades de Pandas, pero no vamos a decorarlas más en esta entrada, pues resultaría un código difícil de seguir.

Digamos que queremos ver la relación entre la cilindrada del motor y el consumo. Para ello dibujamos una nube de puntos:

In [4]:
fedata.plot(kind='scatter', y='displ', x='autovia')
fedata.plot(kind='scatter', y='displ', x='ciudad')
plt.show()

En términos generales, podemos decir que a mayor cilindrada, mayor consumo. También podemos analizar el consumo por tipo de vehículo:

In [5]:
fedata.groupby('class').mean().loc[:,['ciudad','autovia']].plot(kind='bar')
plt.show()

Comparando con la gráfica de barras por defecto de Matplotlib, esta tiene algunas personalizaciones. Por ejemplo, las columnas están centradas sobre las etiquetas, y éstas a su vez están rotadas para una lectura más cómoda. Esto señala que el subsistema gráfico de Pandas está diseñado para visualizar los datos de forma cómoda y fácil para el proceso de análisis de datos.

Como siempre, hay mucho más que contar sobre las capacidades gráficas de Pandas. Con lo que hemos visto aquí, podemos intuir que dichas funciones están implementadas para estar a mano cuando las necesitemos para entender mejor nuestras estructuras de datos; más que para producir gráficas publicables. Aun así, con un poco de esfuerzo y las funciones de decoración de Matplotlib, podemos lograr gráficas presentables. Esto nos dará una serie de ventajas, como las grandes posibilidades de personalización, disponibilidad de funciones y documentación, etc.; y algunas desventajas, como la dificultad y la complejidad del código.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *