Visualizando

Resumen

Enseñando: 15 min
Ejercicios: 15 min
Preguntas
  • ¿Cómo puedo graficar mis datos?

  • ¿Cómo puedo guardar mi gráfico para publicarlo?

Objectivos
  • Crear un gráfico de serie temporal que muestre un único conjunto de datos.

  • Crear un gráfico de dispersión que muestre la relación entre dos conjuntos de datos.

matplotlib es la biblioteca de graficado científico más utilizada en Python.

%matplotlib inline
import matplotlib.pyplot as plt
time = [0, 1, 2, 3]
position = [0, 100, 200, 300]

plt.plot(time, position)
plt.xlabel('Time (hr)')
plt.ylabel('Position (km)')

Gráfica simple de Posición-Tiempo

Graficar datos directamente desde un dataframe de Pandas.

import pandas as pd

data = pd.read_csv('data/gapminder_gdp_oceania.csv', index_col='country')

# Extraer el año de los 4 últimos caracteres de cada nombre de columna
# Los nombres de columna actuales están estructurados como 'gdpPercap_(year)', 
# Entonces queremos mantener la parte del año (year) solo para claridad cuando grafiquemos PIB vs. años
# Para hacer esto, usamos strip(), el cual remueve de la cadena los caracteres declarados en el argumento 
# Este método funciona en cadenas, entonces llamamos str antes de strip()
years = data.columns.str.strip('gdpPercap_')

# Convertir los valores del año a enteros, guardando los resultados nuevamente en el marco de datos. 

data.columns = years.astype(int)

data.loc['Australia'].plot()

Gráfico del PIB de Australia

Selecciona y transforma los datos, luego lo graficas.

data.T.plot()
plt.ylabel('PIB per capita')

Gráfico del PIB de Australia y Nueva Zelanda

Varios estilos de gráficos están disponibles.

plt.style.use('ggplot')
data.T.plot(kind='bar')
plt.ylabel('GDP per capita')

Diagrama de barras del PIB de Australia

Los datos pueden ser también graficados llamando a la función plot de matplotlib directamente.

Obtener datos de Australia desde el marco de datos

years = data.columns
gdp_australia = data.loc['Australia']

plt.plot(years, gdp_australia, 'g--')

Gráfico formateado del PIB para Australia

Se puede trazar varios conjuntos de datos juntos.

# Selecciona el valor de los datos de dos países.
gdp_australia = data.loc['Australia']
gdp_nz = data.loc['New Zealand']

# Grafica con marcadores de diferentes colores.
plt.plot(years, gdp_australia, 'b-', label='Australia')
plt.plot(years, gdp_nz, 'g-', label='New Zealand')

# Crea leyenda
plt.legend(loc='upper left')
plt.xlabel('Year')
plt.ylabel('GDP per capita ($)')

Añadiendo una leyenda

A menudo, al trazar múltiples conjuntos de datos en la misma figura, es deseable tener una leyenda describiendo los datos.

Esto se puede hacer en matplotlib en dos etapas:

  • Provee una etiqueta por cada set de datos en la figura:
plt.plot(years, gdp_australia, label='Australia')
plt.plot(years, gdp_nz, label='New Zealand')
  • Instruye a matplotlib para que crea una leyenda.
plt.legend()

Por defecto matplotlib intentara colocar la leyenda en una posición adecuada. Si preferirías especificar una posición se podría hacer con el argumento loc=, por ejemplo, para colocar la leyenda en la esquina superior izquierda de la gráfica, se puede especificar loc='upper left'

Gráfica formateada del PIB para Australia y Nueva Zelanda

plt.scatter(gdp_australia, gdp_nz)

Correlación del PIB utilizando plt.scatter

data.T.plot.scatter(x = 'Australia', y = 'New Zealand')

Correlación del PIB utilizando data.T.plot.scatter

Mínimo y Máximo

Completa los espacios en blanco a continuación para graficar el PIB mínimo per cápita a lo largo del tiempo para todos los países en Europa. Modificalo de nuevo para graficar el PIB máximo per cápita a lo largo del tiempo para Europa.

data_europe = pd.read_csv('data/gapminder_gdp_europe.csv', index_col='country')
data_europe.____.plot(label='min')
data_europe.____
plt.legend(loc='best')
plt.xticks(rotation=90)

Solución

data_europe = pd.read_csv('data/gapminder_gdp_europe.csv', index_col='country')
data_europe.min().plot(label='min')
data_europe.max().plot(label='max')
plt.legend(loc='best')
plt.xticks(rotation=90)

Minima Maxima Solución

Correlaciones

Modifica el ejemplo en las notas para crear un diagrama de dispersión que muestre la relación entre el PIB mínimo y máximo per cápita entre los países de Asia por cada año en el conjunto de datos. ¿Qué relación se ve (si es que existe)?

data_asia = pd.read_csv('data/gapminder_gdp_asia.csv', index_col='country')
data_asia.describe().T.plot(kind='scatter', x='min', y='max')

Solución

Correlaciones Solución 1

No se pueden ver correlaciones particulares entre los valores mínimos y máximos de PIB año a año. Parece que las fortunas de los países asiáticos no suben ni bajan juntas.

Puedes notar que la variabilidad en el máximo es mucho mayor que la del mínimo. Dale una mirada a los índices maximos y max:

data_asia = pd.read_csv('data/gapminder_gdp_asia.csv', index_col='country')
data_asia.max().plot()
print(data_asia.idxmax())
print(data_asia.idxmin())

Solución

Correlaciones Solución 2

Parece que la variabilidad en este valor se debe a una fuerte caída después de 1972. ¿Alguna geopolítica en juego quizás? Dado el dominio de los países productores de petróleo, tal vez el índice de crudo Brent haría una comparación interesante? Mientras que Myanmar tiene consistentemente el pib más bajo, la nación con el pib más alto ha variado más notablemente.

Más Correlaciones

set Este breve programa crea un grsetáfico que muestra la correlación entre el PIB y la esperanza de vida para 2007, normalizando el tamaño del marcador por población:

data_all = pd.read_csv('data/gapminder_all.csv', index_col='country')
data_all.plot(kind='scatter', x='gdpPercap_2007', y='lifeExp_2007',
              s=data_all['pop_2007']/1e6)

Usando ayuda en línea y otros recursos, explica lo que hace cada argumento para plot.

Solución

Solución de Más Correlaciones

Un buen lugar para buscar es la documentación para la función plot - help(data_all.plot).

kind - Como ya se ha visto, esto determina el tipo de gráfico que se dibujará.

“x” e “y” - Un nombre de columna o índice que determina qué datos serán colocado en los ejes x e y del gráfico

s - Los detalles para esto se pueden encontrar en la documentación de plt.scatter. Un solo número o un valor para cada punto de datos. Determina el tamaño de los puntos graficados.

Guardando tu gráfico en un archivo

Si estás satisfecho con el gráfico que se ve, es posible que desees guardarlo en un archivo, quizás para incluirlo en una publicación. Hay una función en el módulo matplotlib.pyplot que cumple con esto: savefig. Llamando a esta función, por ejemplo con

plt.savefig('my_figure.png')

guardará la figura actual en el archivo my_figure.png. El formato de archivo se deducirá automáticamente de la extensión del nombre del archivo (otros formatos son pdf, ps, eps y svg).

Ten en cuenta que las funciones en plt se refieren a una variable de figura global y después de que se haya mostrado una figura en la pantalla (por ejemplo, con plt.show) matplotlib hará que esta variable se referencie a una nueva figura vacía. Por lo tanto, asegúrate de llamar a plt.savefig antes de mostrar el grafico por pantalla, de lo contrario, puedes encontrar un archivo con un gráfico vacío.

Cuando se usan marcos de datos, los datos a menudo se generan y se grafican en la pantalla en una línea, y plt.savefig no parece ser una método posible. Una posibilidad para guardar la figura en el archivo es entonces

  • guardar una referencia a la figura actual en una variable local (con plt.gcf)
  • llamar al método de la clase savefig desde esa variable
fig = plt.gcf() # Obten la figura actual
data.plot(kind='bar')
fig.savefig('my_figure.png')

Hacer tus gráficas accesibles

Siempre que estes generando gráficos que van en un documento o una presentación, hay algunas cosas que puedes hacer para asegurarte de que todos puedan entender tus diagramas

  • Siempre asegúrate de que tu texto es lo suficientemente grande para leerlo. Usa el parámetro fontsize en xlabel, ylabel, title, y legend, y tick_params con labelsize para aumentar el tamaño del texto de los números en sus ejes.
  • Del mismo modo, debes hacer que los elementos de tus gráficos sean fáciles de ver. Usa s para aumentar el tamaño de los marcadores de tu diagrama de dispersión y linewidth para aumentar el tamaño de las líneas del trazado.
  • Usar colores (y nada más) para distinguir entre diferentes elementos del gráfico hará que los trazados sean ilegibles para cualquier persona daltónica o que tenga una impresora en blanco y negro. Para líneas, el parámetro linestyle permite utilizar diferentes tipos de líneas. Para diagramas de dispersión, marker permite cambiar la forma de los puntos. Si no estás seguro acerca de tus colores, puede usar Coblis o Color Oracle para simular cómo se verían tus gráficos para aquellos con daltonismo.

Puntos Clave

  • matplotlib es la biblioteca de generación de gráficos científicos más utilizada en Python.

  • Grafica datos directamente desde un dataframe de Pandas.

  • Selecciona y transforma datos, luego grafícalos.

  • Muchos estilos de gráfico están disponibles: ve la Galería de Gráficos de Python para más opciones.

  • Puedes graficar muchos conjuntos de datos juntos.