Trabajando Con Maplotlib de Python
Trabajando Con Maplotlib de Python
Invítame a un Café
Python cuenta con varias librerias para visualizacion las principale son:
matplotlib para graficas sencillas: bars, pies, lines, scatter plots, etc.
Seaborn para visualizacion estadistica: Para crear mapas de calor o de alguna
manera resumiendo los datos y aún desea mostrar la distribución de los datos.
Plotly y Bokeh para visualizacion interactiva: Si los datos son tan complejos
(o no puede ver la informacion de sus datos), utilice plotly y Bokeh para crear
visualizaciones interactivas que permitan a los usuarios explorar los datos
mismos.
Importancia de la visualizacion
El siguiente codigo demostrara El cuarteto de Anscombe demostracion realizada por
el estadístico F. J. Anscombe.
%matplotlib inline
anscombe =
pd.read_csv('https://github.com/mwaskom/seaborn-data/raw/master/ansc
ombe.csv')
anscombe
dataset x y
0 I 10. 8.04
dataset x y
1 I 8.0 6.95
13.
2 I 7.58
0
3 I 9.0 8.81
11.
4 I 8.33
0
14.
5 I 9.96
0
6 I 6.0 7.24
7 I 4.0 4.26
12.
8 I 10.84
0
9 I 7.0 4.82
1
I 5.0 5.68
0
1 10.
II 9.14
1 0
1
II 8.0 8.14
2
1 II 13. 8.74
dataset x y
3 0
1
II 9.0 8.77
4
1 11.
II 9.26
5 0
1 14.
II 8.10
6 0
1
II 6.0 6.13
7
1
II 4.0 3.10
8
1 12.
II 9.13
9 0
2
II 7.0 7.26
0
2
II 5.0 4.74
1
2 10.
III 7.46
2 0
2
III 8.0 6.77
3
4 0
2
III 9.0 7.11
5
2 11.
III 7.81
6 0
2 14.
III 8.84
7 0
2
III 6.0 6.08
8
2
III 4.0 5.39
9
3 12.
III 8.15
0 0
3
III 7.0 6.42
1
3
III 5.0 5.73
2
3
IV 8.0 6.58
3
3
IV 8.0 5.76
4
3 IV 8.0 7.71
dataset x y
3
IV 8.0 8.84
6
3
IV 8.0 8.47
7
3
IV 8.0 7.04
8
3
IV 8.0 5.25
9
4 19.
IV 12.50
0 0
4
IV 8.0 5.56
1
4
IV 8.0 7.91
2
4
IV 8.0 6.89
3
datase
t
Calcular la correlacion
dat
aset
I 0.500091 3.000091
II 0.500000 3.000909
II 0.499727 3.002455
IV 0.499909 3.001727
MATPLOTLIB
Matplotlib es el “abuelo” de las librerias de visualización de datos con Python. Fue
creado por John Hunter. Lo creó para tratar de replicar las capacidades de graficar de
MatLab en Python.
Instalacion
Se debe instalar Matplotlib, pero si instalo Anaconda ya viene instalado, en caso de
que no lo tenga se puede instalar asi:
Importar la libreria
Importar el modulo matplotlib.pyplot con el nombre de plt (esto es un
estandar en la comunidad):
%matplotlib inline
Esa línea es solo para Jupyter notebooks, si está usando otro editor,
usará: plt.show() al final de todos sus comandos de graficos para que aparezca
la figura en otra ventana.
import numpy as np
x = np.linspace(0,5, 11)
y = x ** 2
x
array([0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. ])
y
array([ 0. , 0.25, 1. , 2.25, 4. , 6.25, 9. , 12.25,
16. ,
20.25, 25. ])
Podemos crear un diagrama de líneas muy simple usando lo siguiente:
Cuadricula (Grid )
plt.plot(x, y, label="x vs y") # se grafica una linea de color azul
# se pone en el atributo 'label' el textto deseado
https://matplotlib.org/2.1.1/api/_as_gen/matplotlib.pyplot.plot.html
Colores Basicos
Con matplotlib, podemos definir los colores de las líneas y otros elementos gráficos
de varias maneras. En primer lugar, podemos usar la sintaxis similar a MATLAB
donde 'b' significa azul,'g' significa verde, etc. También se admite la API
MATLAB para seleccionar estilos de línea: donde, por ejemplo, ‘b.-‘significa una
línea azul con puntos:
También podemos definir colores por sus nombres o códigos hexadecimales RGB y,
opcionalmente, proporcionar un valor alpha utilizando los argumentos de palabras
clave color y alpha. Alpha indica opacidad.
plt.subplots(figsize=(12,6))
# lineas parametrizadas
line, = plt.plot(x, x+8, color="black", lw=1.50)
line.set_dashes([5, 10, 15, 10]) # formato: longitud de linea,
longitud de espacio, ...
# posibles simbolos del marcas: marker = '+', 'o', '*', 's', ',',
'.',bb '1', '2', '3', '4', ...
plt.plot(x, x+ 9, color="blue", lw=3, ls='-', marker='+')
plt.plot(x, x+10, color="blue", lw=3, ls='--', marker='o')
plt.plot(x, x+11, color="blue", lw=3, ls='-', marker='s')
plt.plot(x, x+12, color="blue", lw=3, ls='--', marker='1')
Subplots
# la funcion es plt.subplot(nrows, ncols, plot_number)
plt.figure(figsize=(12, 4))
plt.subplot(1,3,1)
plt.plot(x, x**2, x, x**3)
plt.title("Rango por defecto de los ejes")
plt.subplot(1,3,2)
plt.plot(x, x**2, x, x**3)
plt.axis('tight')
plt.title("Ejes apretados")
plt.subplot(1,3,3)
plt.plot(x, x**2, x, x**3)
plt.ylim([0, 60])
plt.xlim([2, 5])
plt.title("ejes de rango personalizados");
Escala Logaritmica
plt.figure(figsize=(10,4))
plt.subplot(1,2,1)
plt.plot(x, x**2, x, np.exp(x))
plt.title("escala Normal")
plt.subplot(1,2,2)
plt.plot(x, x**2, x, np.exp(x))
plt.yscale("log")
plt.title("Escala Logaritmica(y)");
# Anotacion 1
plt.text(0.15, 0.2, r"$y=x^2$", fontsize=20, color="blue")
#Anotacion 2
plt.text(0.65, 0.1, r"$y=x^3$", fontsize=20, color="green");
for ax in axes:
ax.plot(x, y, 'g')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('title')
plt.tight_layout() # para que no se superpongan las graficas
plt.scatter(x, y)
plt.title("Scatter plot Simple");
plt.show() # En jupyter notebook no es necesario este comando
# boxplot rectangular
plt.boxplot(data,vert=True,patch_artist=True);
plt.title("Boxplot");
Diagramas de Violin
Permiten ver como es la distribucion de los datos
# plot de violin
axes[0].violinplot(all_data,
showmeans=False,
showmedians=True)
axes[0].set_title('violin plot')
Diagramas de torta
No usarlos, los humanos no somos buenos discriminando angulos
# Graficas de error
plt.errorbar(x, y, xerr=0.2, yerr=0.4)
plt.title("Diagrama de error")
plt.grid()
plt.show()
fig.savefig("figura.pdf", dpi=200)
Importar la libreria
import pandas as pd
import numpy as np
%matplotlib inline
Datos para graficar:
df1 =
pd.read_csv('https://github.com/mwaskom/seaborn-data/raw/master/mpg.
csv')
df1.head()
h
displ orse wei accelera model_ or
mpg cylinders name
acement pow ght tion year igin
er
1 36 us buick skylark
1 15.0 8 350.0 11.5 70
65.0 93 a 320
1 34 us plymouth
2 18.0 8 318.0 11.0 70
50.0 36 a satellite
1 34 us amc rebel
3 16.0 8 304.0 12.0 70
50.0 33 a sst
1 34 us
4 17.0 8 302.0 10.5 70 ford torino
40.0 49 a
df2 =
pd.read_csv('https://github.com/mwaskom/seaborn-data/raw/master/iris
.csv')
df2.head()
sepal_len sepal_wi petal_len petal_wi spe
gth dth gth dth cies
set
0 5.1 3.5 1.4 0.2
osa
set
1 4.9 3.0 1.4 0.2
osa
set
2 4.7 3.2 1.3 0.2
osa
osa
set
4 5.0 3.6 1.4 0.2
osa
df1['acceleration'].hist();
df1['acceleration'].hist();
plt.style.use('bmh')
df1['acceleration'].hist();
plt.style.use('dark_background')
df1['acceleration'].hist();
plt.style.use('fivethirtyeight')
df1['acceleration'].hist();
df.plot.area
df.plot.barh
df.plot.density
df.plot.hist
df.plot.line
df.plot.scatter
df.plot.bar
df.plot.box
df.plot.hexbin
df.plot.kde
df.plot.pie
También se puede llamar a df.plot(kind = 'hist') o reemplazar ese
argumento kind con cualquiera de los términos clave que se muestran en la lista
anterior (por ejemplo, ‘box’, ‘barh’, etc.)
Area
# Se puede hacer de las siguiente manera
#df2.plot(kind='area',alpha = 0.4)
df2.plot.area(alpha=0.4);
Barplots
# Visualizacion de datos
df2.head()
sepal_len sepal_wi petal_len petal_wi spe
gth dth gth dth cies
set
0 5.1 3.5 1.4 0.2
osa
osa
set
2 4.7 3.2 1.3 0.2
osa
set
3 4.6 3.1 1.5 0.2
osa
set
4 5.0 3.6 1.4 0.2
osa
Histogramas
df1.head()
m cylin displacem horsepo wei accelera model_y or
name
pg ders ent wer ght tion ear igin
chevrol
1 35 us et
0 8 307.0 130.0 12.0 70
8.0 04 a chevelle
malibu
buick
1 36 us
1 8 350.0 165.0 11.5 70 skylark
5.0 93 a
320
uth
8.0 36 a
satellite
1 34 us amc
3 8 304.0 150.0 12.0 70
6.0 33 a rebel sst
1 34 us ford
4 8 302.0 140.0 10.5 70
7.0 49 a torino
df1['acceleration'].plot.hist(bins=50);
Lineas
# eje y = valores de la acceleracion
# eje x = valores del index
# atributo lw es el grosor de la linea
df1.plot.line(y='acceleration',figsize=(12,3),lw=1);
Scatter Plots
df1.plot.scatter(x='acceleration',y='mpg');
Se puede usar c para indicar el color de los valores de otra columna Con cmap se
indica el mapa de colores que se usaran. Para ver los colormaps
existente: http://matplotlib.org/users/colormaps.html
df1.plot.scatter(x='acceleration',y='mpg',c='model_year',cmap='coolw
arm');
O se puede usar s para indicar el tamaño de los puntos. El parametro s debe ser un
arreglo, no solo el nombre de una columna:
df1.plot.scatter(x='acceleration',y='mpg',s=df1['horsepower']*2);
BoxPlots
df2.plot.box(); # Tambien se puede poner by= argumento para groupby
Diagrama de Torta
serie = pd.Series(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'],
name='series')
serie.plot.pie(figsize=(6, 6));
Hexagonal
Util para datos de 2 variables, alternativa al scatterplot:
df1.plot.hexbin(x='acceleration',y='mpg',gridsize=25,cmap='Oranges')
;
Kernel Density Estimation Plot(KDE)
df1['weight'].plot.kde();
df2.plot.density();
Scatter Matrix
pd.plotting.scatter_matrix(df2, figsize=(8, 8));
Parametros de las graficas
Graficar con Pandas es un método de hacer graficas mucho más fácil de usar que
matplotlib, equilibra la facilidad de uso con control sobre la figura. Muchas de las
llamadas a gráficos también aceptan argumentos adicionales de matplotlib plt.
https://joserzapata.github.io/
https://twitter.com/joserzapata