MatplotLib

@Realizado por Aldeir Herrera

Porque Utilizar Matplotlib y Seaborn


Estas librerias son diseñadas para la visualización de datos proporcionando alta personalización del gráfico.

Pero… porque se necesita visualizar datos.

  • Mayor claridad de nuestro codigo.

  • Mayor contexto de los datos.

  • Hallar patrones, outliers (valores atípicos) en nuestros datos.

Que nos proporcionan matplotlib?

  • Simple

  • Rápida

  • Personalizable

Por otra parte Seaborn (sns) es una libreria creada sobre Matplotlib. SNS posee la simplicidad suficiente para que podamos graficar visualizaciones de todo tipo. Por otro lado, matplotlib agrega esa capa de personalización que sns necesita en algunas ocasiones.

Si piensas que matplotlib es una libreria cualquiera, me temo que puedes estar equivocado; la famosa cientifica Katie Bouman y el equipo de cientificos del proyecto Evento Horizon, conocidos por tomar la primera imagen de un agujero negro, utilizaron Matplotlib, numpy, pandas, entre otras librerias de python para visualizar y calibrar en su momento, datos importantes y necesarios para esa primera fotografía.

Vamos a comenzar a graficar de forma rápida con matplotlib.

#Graficando con pyplot de matplotlib... luego veremos como se grafica con sns
import matplotlib.pyplot as plt
import numpy as np

#Creamos un vector de 4 a 20 con trece divisiones
vectors_x = np.linspace(4,20,13)
#El vectors_y esta compuesto de cada valor del vectors_y solo que estan potenciados al cuadrado.
vectors_y = vectors_x**2
vectors_x, vectors_y
(array([ 4.        ,  5.33333333,  6.66666667,  8.        ,  9.33333333,
        10.66666667, 12.        , 13.33333333, 14.66666667, 16.        ,
        17.33333333, 18.66666667, 20.        ]),
 array([ 16.        ,  28.44444444,  44.44444444,  64.        ,
         87.11111111, 113.77777778, 144.        , 177.77777778,
        215.11111111, 256.        , 300.44444444, 348.44444444,
        400.        ]))
#Grafica continua
#escribimos el eje de la x, eje de la y
#luego el estilo de la grafica que queremos
plt.plot(vectors_x, vectors_y, 'b+')
[<matplotlib.lines.Line2D at 0x23c50461fa0>]
_images/Matplot_2_1.png
#Grafico de una sola variable con un histograma
plt.hist(vectors_y)
(array([3., 2., 1., 1., 1., 1., 1., 1., 1., 1.]),
 array([ 16. ,  54.4,  92.8, 131.2, 169.6, 208. , 246.4, 284.8, 323.2,
        361.6, 400. ]),
 <BarContainer object of 10 artists>)
_images/Matplot_3_1.png
#Grafico de tipo pastel (pie)
plt.pie(vectors_y)
plt.show
<function matplotlib.pyplot.show(close=None, block=None)>
_images/Matplot_4_1.png
#Grafico de dispersion (scatter)
plt.scatter(vectors_x, vectors_y)
plt.show()
_images/Matplot_5_0.png

Estas son visualizaciones sencillas donde utilizamos pyplot de matplotlib.

Subplot

Subplot nos permite mostrar en una sola interfaz los graficos que querramos. Por ejemplo.

#Subplot se compone de (numero de filas, numero de columnas, posicion actual)
plt.subplot(2,1,1)
plt.pie(vectors_y) #Grafico de tipo pastel (pie)
plt.subplot(2,1,2)
plt.scatter(vectors_x, vectors_y) #Grafico de dispersion (scatter)
plt.plot(vectors_y, 'rX-') #agreguemosle a la grafica de dispersion los vectores_y
plt.show()
_images/Matplot_7_0.png

Metodo orientado a objeto


Como vimos en el código anterior, graficar con pyplot es sumamente sencillo. Tambien podemos realizar estos gráficos con el método orienta a objetos. Pero cual es la diferencia?

  • Mayor personalización

  • Más amigable a múltiples diagramas

  • Más codigo

  • Crear distintos tipos de gráficos en uno solo…

Vamos al código para verificar como se utiliza el método orientado a objeto con un ejemplo; presta atencion a la personalizacion y no a los datos como tal.

#figure sera como el lienzo general y le vamos agregando los axes por separado
figure = plt.figure()

#todo lo que inicia con axes, sera un grafico.
#pig = posicion donde inicia el grafico
axes = figure.add_axes([0.1,0.1,0.4,0.8]) #add axes se compone de ( [pig en x, pig en y , ancho del grafico, alto del grafico ] )
axes.plot(vectors_x) 

#ahora agregamos el grafico de tipo histograma
axes_2  = figure.add_axes([0.14, 0.61,0.2,0.2])
axes_2.hist(vectors_y)
axes_2.set_facecolor('red')#agregemos el colo rojo de fondo al axes_2

#muestra todo el grafico
plt.show()
_images/Matplot_9_0.png

Subplots


Subplots crea un esquema y los replica entre varias graficas en un solo ¨lienzo¨. Por lo tanto el objeto figura se puede llamar una sola vez y engloba todas las gráficas.

Subplot por otra parte, crea un solo par de ejes para un grafico en especifico. Esto implica que llamemos varias veces el objeto figure para crear cada grafica.

Veamos los ejemplos.

Subplots

En una sola linea obtenemos el objeto figure y los axes (graficos)

fig, axes = plt.subplots(nrows=2, ncols=3)

Subplot

Se crean los objetos figure y axe por separado

fig = plt.figure(1)
#grafica 1
ax1 = plt.subplot(231)
ax1 = fig.add_subplot(231)
#grafica 2
ax2 = plt.subplot(232)
ax2 = fig.add_subplot(232)
#creamos un vector de 10 a 25 con dividido en 10 items
vector_random = np.linspace(10,25,10)
vector_random
array([10.        , 11.66666667, 13.33333333, 15.        , 16.66666667,
       18.33333333, 20.        , 21.66666667, 23.33333333, 25.        ])
#utilizamos Subplots
import matplotlib.pyplot as plt #importamos pyplot
fig, axes = plt.subplots(nrows=2, ncols=2) #numero de filas (2) y columnas (2) = 4 graficos 

#Primer grafico
axes[0,0].plot(vector_random, np.tan(vector_random), 'r*-') 
#Segundo grafico
axes[0,1].scatter(vector_random, np.cos(vector_random))
#Espaciamos todas las graficas para una visualizacion mas legible
fig.tight_layout()
_images/Matplot_12_0.png

Hay otra forma de escribir la tercera linea del código anterior. Es decir fig, axes = plt.subplots(nrows=2, ncols=2) es igual a:

fig, ((axes1,axes2),(axes3,axes4)) = plt.subplots(nrows=2, ncols=2)
#o tambien sin argumentos explicitos
fig, ((axes1,axes2),(axes3,axes4)) = plt.subplots(2, 2)

Como tarea/reto, podemos graficar la segunda linea del código anterior que se encuentra vacía. Puedes encontrar más estilos y gráficos en el siguiente enlace y los colores en este enlace

fig, axes = plt.subplots(2,2)
axes[0,0].plot(vector_random, np.tan(vector_random))
axes[0,1].plot(np.cosh(vector_random), '8--m')
axes[1,0].plot(vector_random, np.cosh(vector_random), color="orange", linestyle="--")
axes[1,1].boxplot(vector_random, vert=False, showmeans=True )
fig.tight_layout()
_images/Matplot_14_0.png

Personalizacion de nuestros gráficos

El siguiente paso es como vamos a personalizar nuestros gráficos. Vamos al codigo para ver como se hace.

📝 Más informacion sobre como personalizar axes[].plot

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(4,15)
y = np.sin(x)
#Volvemos a generar nuestro grafico
fig, axes = plt.subplots(1,2)
#Primer grafico y propiedades
axes[0].plot(x,y, color='peru', marker='H', linestyle='-.') 

#Agrengando mas propiedades
axes[0].grid() #Agregamos cuadriculas
axes[0].set_xlabel('X') #leyenda del eje X
axes[0].set_ylabel('Y') #leyenda de eje Y
axes[0].set_title('First Plot')

#Segunda grafica
axes[1].plot(np.exp(x), color='cyan', label='exp(x)') #aqui creamos el legend
axes[1].set_xlabel('X') #leyenda del eje X
axes[1].set_ylabel('Y') #leyenda del eje Y
axes[1].set_title('Sec plot') #leyenda del titulo
axes[1].legend() #aqui desplegamos el legend

fig.tight_layout()
_images/Matplot_17_0.png

Colores y estilos

Hasta ahora hemos hecho gráficos, en fondo blanco con ejes en color negro. Vamos a revisar otras formas

x = np.linspace(0,5,11)
print(plt.style.available)
#Se imprimen todos los estilos disponibles los mismos tienen un tema predeterminado
['Solarize_Light2', '_classic_test_patch', '_mpl-gallery', '_mpl-gallery-nogrid', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']
#vamos a desplegar el tema actual e iremos cambiando los diferentes tipos de temas
fig, axs = plt.subplots(figsize=(4,5))
_images/Matplot_20_0.png
#cambiaremos el tema y volveremos a ejecutarla linea anterior
plt.style.use('seaborn-colorblind')
fig, axs = plt.subplots(figsize=(4,3), nrows=1, ncols=1)
#Trazando lineas
axs.plot(x, x**2, color='goldenrod', linestyle='dashed') #Aqui agregamos un tipo de line style
axs.plot(x, x+1, color='teal', marker='h', markersize=14) #Aqui agregamos un marker y un tamaño acentuado
axs.plot(x, x+3, color='firebrick', linestyle='-', marker='<') #linea continua con triangulos en los puntos
[<matplotlib.lines.Line2D at 0x23c5225c2b0>]
_images/Matplot_21_1.png

Barplot

Las gráficas de barras nos permiten manipular variables categóricas y es una de las máss utilizadas clasicamente. Vamos a utilizar matplot para realizar este tipo de gráfica.

plt.style.use('seaborn-muted')
#Vamos a utilizar 
country = ['INDIA','JAPON','UNITED KINGDOM','COLOMBIA','GERMANY']
population = [1000,800,900,1000,300]
#Ahora vamos a graficar
plt.bar(country, population, width=0.4, color=['darkgreen','blue'] ) #definimos el ancho de los graficos con width y los colores
#Traduciendo los x labels a espa;ol
plt.xticks(np.arange(5), ['India', 'Japon', 'Reino Unido', 'Colombia', 'Alemania' ], rotation=45)
plt.show()
_images/Matplot_23_0.png
#Graficar barplot de forma horizontal.
plt.barh(country, population)
plt.show()
_images/Matplot_24_0.png

Otros Gráficos

  • Histograma

  • Boxplot

import matplotlib.pyplot as plt
import numpy as np

#Vamos a crear un arreglo de una dimension
data = np.random.randint(1,50,100)
#Histograma
plt.hist(x=data, bins=10, histtype='step')
plt.show()
_images/Matplot_27_0.png
#Boxplot
#Agregaremos un valor atipico (outlier)
data = np.append(data,200)
plt.boxplot(x=data, vert=False, patch_artist=True, notch=True, showfliers=False)
plt.show()
#Si no queremos que el outlier salga entonces podemos escribir el parametro showfliers=False
_images/Matplot_28_0.png
#Scatter
N=30
x=np.random.rand(N)
y=np.random.rand(N)
area = (30 * np.random.rand(N)) **2
colors = np.random.rand(N)
#graficando
plt.scatter(x=x, y=y, s=area, c=colors, marker='>')
<matplotlib.collections.PathCollection at 0x23c50e5db80>
_images/Matplot_29_1.png

Bonus

Cheatsheet