Intro a Matplotlib

Matplotlib = Libreria para graficas cosas matematicas

Que es Matplotlib?

Matplotlin es un libreria para crear imagenes 2D de manera facil.

Checate mas en :

Para usar matplotlib, solo tiene que importar el modulo ..tambien te conviene importar numpy pues es muy util


In [21]:
import numpy as np # modulo de computo numerico
import matplotlib.pyplot as plt # modulo de graficas
import pandas as pd # modulo de datos
# esta linea hace que las graficas salgan en el notebook
%matplotlib inline

Crear graficas (plot)

Crear graficas es muy facil en matplotlib, si tienes una lista de valores X y otra y..solo basta usar :


In [24]:
x = np.array([0,1,2,3,4])
y = x**2 #cuadramos x
plt.plot(x,y)
plt.title("Grafica sencilla")
plt.show()


Podemos usar la funcion np.linspace para crear valores en un rango, por ejemplo si queremos 100 numeros entre 0 y 10 usamos:


In [20]:
x = np.linspace(0,10,100)
y = x**2 #cuadramos x
plt.plot(x,y)
plt.title("Grafica sencilla")
plt.show()


Y podemos graficar dos cosas al mismo tiempo:


In [ ]:
x = np.linspace(0,10,100)
y1 = x # una linea
y2 = x**2 # cuadramos x
plt.plot(x,y1)
plt.plot(x,y2)
plt.title("Dos graficas sencillas")
plt.show()

Que tal si queremos distinguir cada linea? Pues usamos legend(), de leyenda..tambien tenemos que agregarles nombres a cada plot


In [ ]:
x = np.linspace(0,10,100)
y1 = x # una linea
y2 = x**2 # cuadramos x
plt.plot(x,y1,label="Linea")
plt.plot(x,y2,label="Cuadrado")
plt.legend()
plt.title("Dos graficas sencillas")
plt.show()

Tambien podemos hacer mas cosas, como dibujar solamente los puntos, o las lineas con los puntos usando linestyle:


In [25]:
x = np.linspace(0,10,100)
y1 = x # una linea
y2 = x**2 # cuadramos x
y3 = np.sqrt(x) # sacamos raiz cuadrada a x
y4 = np.power(x,1.5) # elevamos x a la potencia 1.5

plt.plot(x,y1,label="Linea",linestyle='-') # linea
plt.plot(x,y2,label="Cuadrado",linestyle=':') # puntitos
plt.plot(x,y3,label="Raiz",linestyle='-.') # linea y punto
plt.plot(x,y4,label="potencia 1.5",linestyle='--') # lineas salteadas
plt.legend()
plt.title("Dos graficas sencillas")
plt.show()


Dibujando puntos (scatter)

Aveces no queremos dibujar lineas, sino puntos, esto nos da informacion de donde se encuentras datos de manera espacial. Para esto podemos usarlo de la siguiente manera:


In [ ]:
N = 50 # numero de puntos
x = np.random.rand(N) # numeros aleatorios entre 0 y 1
y = np.random.rand(N)
plt.scatter(x, y)
plt.title("Scatter de puntos aleatorios")
plt.show()

Pero ademas podemos meter mas informacion, por ejemplo dar colores cada punto, o darle tamanos diferentes:


In [ ]:
N = 50 # numero de puntos
x = np.random.rand(N) # numeros aleatorios entre 0 y 1
y = np.random.rand(N)
colores = np.random.rand(N) # colores aleatorios
radios= 15 * np.random.rand(N) # numeros aleatorios entre 0 y 15
areas = np.pi * radios**2 # la formula de area de un circulo
plt.scatter(x, y, s=areas, c=colores, alpha=0.5)
plt.title("Scatter plot de puntos aleatorios")
plt.show()

Histogramas (hist)

Los histogramas nos muestran distribuciones de datos, la forma de los datos, nos muestran el numero de datos de diferentes tipos:


In [ ]:
N=500
x = np.random.rand(N) # numeros aleatorios entre 0 y 1
plt.hist(x)
plt.title("Histograma aleatorio")
plt.show()

otro tipo de datos, tomados de una campana de gauss, es decir una distribucion normal:


In [ ]:
N=500
x = np.random.randn(N)
plt.hist(x)
plt.title("Histograma aleatorio Normal")
plt.show()

In [ ]:
N=1000
x1 = np.random.randn(N)
x2 = 2+2*np.random.randn(N)

plt.hist(x1,20,alpha=0.3)
plt.hist(x2,20,alpha=0.3)
plt.title("Histograma de dos distribuciones")
plt.show()

Bases de datos en el internet

Aveces los datos que queremos se encuentran en el internet. Asumiendo que se encuentran ordenados y en un formato amigable siempre los podemos bajar y guardar como un DataFrame.

Por ejemplo:

Gapminder es una pagina con mas de 500 conjunto de daatos relacionado a indicadores globales como ingresos, producto interno bruto (PIB=GDP) y esperanza de vida.

Aqui bajamos la base de datos de esperanza de vida, lo guardamos en memoria y lo lodeamos como un excel:

Ojo! Aqui usamos .head() para imprimir los primeros 5 renglones del dataframe pues son gigantescos los datos.


In [9]:
xurl="http://spreadsheets.google.com/pub?key=phAwcNAVuyj2tPLxKvvnNPA&output=xls"
df=pd.read_excel(xurl)
print("Tamano completo es %s"%str(df.shape))
df.head()


Tamano completo es (260, 217)
Out[9]:
Life expectancy with projections. Yellow is IHME 1800 1801 1802 1803 1804 1805 1806 1807 1808 ... 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015
0 Abkhazia NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 Afghanistan 28.2110 28.200753 28.190507 28.18026 28.170013 28.159767 28.14952 28.139273 28.129027 ... 53.2 53.6 54.0 54.5 54.8 55.2 55.5 56.2 56.91 57.63
2 Akrotiri and Dhekelia NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 Albania 35.4000 35.400000 35.400000 35.40000 35.400000 35.400000 35.40000 35.400000 35.400000 ... 74.5 74.7 74.9 75.0 75.2 75.5 75.7 75.8 75.90 76.00
4 Algeria 28.8224 28.822400 28.822400 28.82240 28.822400 28.822400 28.82240 28.822400 28.822400 ... 74.8 75.0 75.3 75.6 75.9 76.1 76.2 76.3 76.40 76.50

5 rows × 217 columns

Arreglando los Datos

Head nos permite darle un vistazo a los datos... asi a puro ojo vemos que las columnas son anios y los renglones los paises...ponder reversar esto con transpose, pero tambien vemos que esta con indices enumerados, prefeririamos que los indices fueran los paises, entonces los cambiamos y tiramos la columna que ya no sirve...al final un head para ver que todo esta bien... a este juego de limpiar y arreglar datos se llama "Data Wrangling"


In [10]:
df = df.rename(columns={'Life expectancy with projections. Yellow is IHME': 'Life expectancy'})
df.index=df['Life expectancy']
df=df.drop('Life expectancy',axis=1)
df=df.transpose()
df.head()


Out[10]:
Life expectancy Abkhazia Afghanistan Akrotiri and Dhekelia Albania Algeria American Samoa Andorra Angola Anguilla Antigua and Barbuda ... Vietnam Virgin Islands (U.S.) North Yemen (former) South Yemen (former) Yemen Yugoslavia Zambia Zimbabwe Åland South Sudan
1800 NaN 28.211000 NaN 35.4 28.8224 NaN NaN 26.98 NaN 33.536 ... 32 33.403 NaN NaN 23.387 NaN 32.6 33.7 NaN 26.665
1801 NaN 28.200753 NaN 35.4 28.8224 NaN NaN 26.98 NaN 33.536 ... 32 33.403 NaN NaN 23.387 NaN 32.6 33.7 NaN 26.665
1802 NaN 28.190507 NaN 35.4 28.8224 NaN NaN 26.98 NaN 33.536 ... 32 33.403 NaN NaN 23.387 NaN 32.6 33.7 NaN 26.665
1803 NaN 28.180260 NaN 35.4 28.8224 NaN NaN 26.98 NaN 33.536 ... 32 33.403 NaN NaN 23.387 NaN 32.6 33.7 NaN 26.665
1804 NaN 28.170013 NaN 35.4 28.8224 NaN NaN 26.98 NaN 33.536 ... 32 33.403 NaN NaN 23.387 NaN 32.6 33.7 NaN 26.665

5 rows × 260 columns

Entonces ahora podemos ver la calidad de vida en Mexico atravez del tiempo:


In [ ]:
plt.xkcd()
df = pd.read_csv("files/training.csv")
plt.plot(df['DER_mass_MMC'][:1000],
         df['DER_mass_transverse_met_lep'][:1000])
plt.show()

de esta visualizacion vemos que la caldiad ha ido subiendo apartir de 1900, ademas vemos mucho movimiento entre 1890 y 1950, justo cuando habia muchas guerras en Mexico.

Tambien podemos seleccionar un rango selecto de años, vemos que este rango es interesante entonces


In [ ]:
subdf=df[ df.index >= 1890 ]
subdf=subdf[ subdf.index <= 1955 ]
subdf['Mexico'].plot()
plt.title("Esperanza de Vida en Mexico entre 1890 y 1955")
plt.show()

o sin tanto rollo, podemos restringuir el rango de nuestra grafica con xlim (los limites del eje X)


In [ ]:
df['Mexico'].plot()
plt.xlim(1890,1955)
plt.title("Esperanza de Vida en Mexico entre 1890 y 1955")
plt.show()

Tambien es importante ver como esto se compara con otros paises, podemos comparar con todo Norteamerica:


In [ ]:
df[['Mexico','United States','Canada']].plot()
plt.title("Esperanza de Vida en Norte-America")
plt.show()

Ejercicios:

  • Compara la esperanza de vida en Latino America (o al menos algunos paises de ella).
  • Solo grafica los años entre 1900 y 2000, tambien 2000-2014.
  • Quita los paises que tienen valores 'Nan', checa la funcion .dropna().
  • Saca estadisticas para paises Latino Americanos.
  • Lo mismo de arriba para diferentes periodos 1800-1900, 1900-2000, 2000-2014

In [ ]: