Pyplot básico Funciones

#Importamos la libreria de Matplotlib
import numpy as np
import matplotlib.pyplot as plt

#Creamos un array con linspace el cual particiona un rango
#en este caso 0 a 5 en 11 partes iguales
x =  np.linspace(0,5,11)
y = x ** 2 #Funcion cuadratica

#Definine los ejes X, Y con plot(X,Y), ademas de formato con 'bs-'
#Ejemplo: plot(x,y,'color,string,tipo_linea') 
plt.plot(x,y,'bs-')
#Para que se muestre la grafica usamos:
plt.show()

image

#Graficar X en un histograma cambiando 'plot' por 'hist'
plt.hist(x)
#plt.pie(x) Grafico de pastel
#plt.scatter(x,y) Grafico de correlacion
#plt.boxplot(x) Grafico de cajas
plt.show()

image

Fomato en Graficas con Matplotlib.pyplot

Formatos de Strings

character

description

‘.’

point marker

‘,’

pixel marker

‘o’

circle marker

‘v’

triangle_down marker

‘^’

triangle_up marker

‘<’

triangle_left marker

‘>’

triangle_right marker

‘1’

tri_down marker

‘2’

tri_up marker

‘3’

tri_left marker

‘4’

tri_right marker

‘8’

octagon marker

‘s’

square marker

‘p’

pentagon marker

‘P’

plus (filled) marker

‘*’

star marker

‘h’

hexagon1 marker

‘H’

hexagon2 marker

‘+’

plus marker

‘x’

x marker

‘X’

x (filled) marker

‘D’

diamond marker

‘d’

thin_diamond marker

‘_’

hline marker

Tipos de Lineas

character

description

‘-’

solid line style

‘–’

dashed line style

‘-.’

dash-dot line style

‘:’

dotted line style

Colores

character

color

‘b’

blue

‘g’

green

‘r’

red

‘c’

cyan

‘m’

magenta

‘y’

yellow

‘k’

black

‘w’

white

Subplot

#Subplot es una herramienta que nos permite colocar varios graficos
#Creamos un array usando numpy

x = np.linspace(0,5,11)
y = x ** 2

#subplot de 1 row X 2 cols luego son dos graficos
#por tanto de indica en el 3er arg si es el 1 o el 2

plt.subplot(1,2,1) #1er Grafico dos en uno

plt.plot(x,y,'g--') #Relacion X,Y
plt.plot(y,x,'g--') #Relacion Y,X

plt.subplot(1,2,2) #2er Grafico
plt.hist(y) # Histograma de Y
plt.show()

image

Método orientado a objetos

#Object Oriented
# - Requiere mas codigo pero vale la pena
# - Mayor personalizacion
# - Mas amigable a mulipple graficos
# - Mas codigo

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,5,11)
y = x ** 2

#Creamos el objeto fig. El metodo figure() es el liezo
#donde van las graficas
fig = plt.figure()

#Definimos las dimenciones y posicion del Lienzo de cada grafico
#add_axes([pos_x,pos_y,len_x,len_y])

axes = fig.add_axes([0.1,0.1,0.8,0.9])
axes2 = fig.add_axes([0.2,0.55,0.4,0.3])

#Graficamos axes como objetos independientes
axes.plot(x,y,'b')
axes2.plot(y,x,'m')

#Mostrar objeto fig o lienzos
fig.show()

image

Partes de Fig image

Subplots

#Object Oriented
# - Requiere mas codigo pero vale la pena
# - Mayor personalizacion
# - Mas amigable a mulipple graficos
# - Mas codigo

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,5,11)
y = np.sin(x)

#Definimos objetos fig y axes, en otras palabras
#crear el lienzo para luego graficar 1 row X 2 cols
fig, axes = plt.subplots(nrows=1,ncols=2) #Diferente de Subplot

#Primer grafico en la posicion [0]
axes[0].plot(x,y,'b')
#Primer grafico en la posicion [1]
axes[1].plot(y,x,'g')
plt.show()

image

#Como la salida es un array entonces podemos definir
#previamente el nombre de los axes en vez de usar posiciones 
fig, (ax1,ax2) = plt.subplots(nrows=1,ncols=2) #Diferente de Subplot

#Exactamente igual al grafico anterior, a esto nos referimos 
#con orientado a objetos independientes
ax1.plot(x,y,'b')
ax2.plot(y,x,'g')
plt.show()

image

#Si creamos un lienzo de tipo matricial
#axes se debe indicar la posicion a menos que 
#(ax1,ax2,ax3,ax4)
fig, axes = plt.subplots(nrows=2,ncols=2)

#Indicamos la posicion de acada axes.
axes[0,0].plot(x,np.cos(x),'y')
axes[0,1].plot(x,np.sin(x),'r')
axes[1,0].plot(x,np.tan(x),'m')
axes[1,1].plot(x,np.cos(x),'b')

#Controla el padding entre bordes de los figs
fig.tight_layout()

image

Leyendas, etiquetas, títulos, tamaño

#A continuacion le daremos mas contexto a los graficos
#Creamos objetos fig y axes

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,5,11)
y = np.sin(x)

#Cambiamos el tamaño todo el Lienzo conÑ 
#figsize=(len_x,len_y)
fig, axes = plt.subplots(1,2,figsize=(5,5))

#Titulo axes[0]
axes[0].set_title('Relacion_X Y')
#Ejes
axes[0].set_xlabel('Axis X')
axes[0].set_ylabel('Axis Y')
#Etiquetamos dentro de 'plot' y con lenged
axes[0].plot(x,y,'b',label='$sin(x)$')
axes[0].legend()

#Titulo axes[1]
axes[1].set_title('Relacion_Y X')
#Ejes
axes[1].set_xlabel('Axis Y')
axes[1].set_ylabel('Axis X')
#Etiquetamos dentro de 'plot' y con lenged
#dentro del signo $$ podemos colocar notacion matematica
axes[1].plot(y,x,'m',label='$sin(y)$')
axes[1].legend()

#Controla el padding entre bordes de los axes
fig.tight_layout()

image

Aporte de Platzi image

Colores y estilos

Estilos de Linea

#Colores y estilos
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0,5,11)

#Mostrar en pantalla los estilos con lo que 
#puedo trabajar
print(plt.style.available)
['Solarize_Light2', '_classic_test_patch', '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']
#Creamos un plot y aplicamos alguno de los stilos
#en plt.style.available de la siguiente forma:
plt.style.use('fivethirtyeight')
fig, ax = plt.subplots(figsize=(8,4))

#Finalmente graficamos con mas stilos:
#Opcionalmente a 'g2-' esta por separado:

#color='#66ffc4'
#marker='0', markersize=10, markerfacecolor='#66ffc4'
#linestyle='--'

#linewidth=1.0

ax.plot(x,x,'m3--',linewidth=1.0,markerfacecolor='#ffffff')
ax.plot(x,2*x,'g2-',linewidth=1.0)
ax.plot(x,3*x,'bo:',linewidth=1.0)
plt.show()

image

Bar Plot

#Los graficos de barras nos permiten 
#graficar variables categoricas

import matplotlib.pyplot as plt
import numpy as np

#Creamos una lista de Pises y de poblacion
country = ['Colombia','Usa','España','Alemania', 'Corea']
population = [1000,800,900,1000,300]

#En X van la variables categoricas
#width=0.5 ancho de las barras
#color=['#ffffff','r'], icluso color por cada barra.
#plt.xticks permite modificar etiquetas eje X y rotation

plt.bar(country,population, width=0.5,color=['#34ffff','b'])
plt.xticks(np.arange(5),('Colombia','Usa','España','Alemania', 'Corea'), rotation=45)
plt.show

image

#Posicionar la barras horizontalmente
plt.barh(country,population)
plt.show

image

Crear otro tipo de gráficas

import matplotlib.pyplot as plt
import numpy as np

#Creamos un array a partir de valores aleatorios
data = np.random.randint(1,50,100)
data
array([23, 13, 17, 12, 31,  5, 43, 23, 13, 46, 30, 34, 43, 16, 46, 48, 14,
       12, 33, 42, 47, 27, 33, 44, 25, 43, 24, 11, 47, 22,  4, 28, 32, 14,
       43, 15, 21, 15, 31,  4, 27, 36, 49, 19,  4, 41, 40, 27, 24, 35,  6,
       20,  5, 26, 45, 46, 13,  8, 42,  7, 37, 47,  4, 24, 49, 32, 45, 48,
       19,  9, 24,  5, 21, 12, 48, 37, 14, 12, 23, 41,  3, 25,  3, 27, 33,
       40, 45,  5, 48, 20, 35, 38, 16, 15,  5,  7, 30, 11, 22,  4])
#Graficar la distribucion de los datos a partir
#un hisgrama, donde podemos configurar los bins

#histtype='step' tipo linea
#histtype='bar' tipo barra
plt.hist(data,bins=10,histtype='step')
plt.show()

image

#Boxplot, indica Rango Intercuartil
#y los diferente quantiles 0.25 0.50 0.75

#vert=False cambia de vertical a horizontal
#patch_artist=True agrega color a la caja
#notch=True enfoca mejor la media de la caja
#showliers=True, Muestra outlyers con False los saca del diagrama

#Añadimos outlyers a la distribucion:
data = np.append(data,(100,200,150))
plt.boxplot(data, vert=False, patch_artist=True, notch=True,showfliers=True)
plt.show()

image

#Grafico de dispersion
#Creamos una varible no importa su valor.
N = 50

#Definimos los valores de X, Y
x = np.random.rand(N)
y = np.random.rand(N)

#Area indica la frecuencia con la que ocurre la relacion X,Y
area = (30 * np.random.rand(N)) ** 2
#Color indica la categoria a la que pertenece cada realacion X,Y
colors = np.random.rand(N)

#Graficamos la relacion y ademas indicamos añadimos mas informacion 
#indicando:
#s=area, frecuencia de la relacion
#c = colors, categoria a la que pertenece la relacion  
#marker='o', estilo de forma, como poligono, estrella, etc..
#alpha = 0.5, le da opacidad al grafico

plt.scatter(x,y,s=area,c = colors, marker='o')
plt.show()

image

Seaborn

Seaborn esta construido sobre matplotlib, hay que tener en cuenta que matpotlib esta optimizado para numpy, sin embargo, seaborn esta optimizado para pandas. Cada grafica resuelve diferentes tipos de problemas:

image

Set

A traves de set podemos modificar varios paramentros en cuanto al estilo, tener en cuenta la documentacion: set_theme, color_palett

import seaborn as sns
import matplotlib.pyplot as plt

sns.barplot(x=['A','B','C'],y=[1,3,2])
#plt.show() funciona debido a que es la base de sns 
plt.show()

image

sns.set(style='darkgrid', palette='muted',font='Verdana', font_scale=1)
sns.barplot(x=['A','B','C'],y=[1,3,2])
#plt.show() funciona debido a que es la base de sns 
plt.show()

image

Parámetros más usados con Seaborn

Algunos Data sources, que podemos usar para experimentar.

#Importamos Seaborn
import seaborn as sns
import matplotlib.pyplot as plt

#Cargamos un dataset built-in sns
tips = sns.load_dataset('tips')

#Veremos displot mas adelante, a continuacion 
#tenemos un histograma de total_bill
sns.displot(data=tips, x = 'total_bill')
plt.show()

image

#Este grafico muestra una relacion entre 'total_bill' y 'tips'
#automaticamente crea un grafico alterno al histograma
#usamos el arg 'hue' para categorizar los datos por 'sex'
sns.displot(data=tips, x='total_bill',y='tip',hue='sex')
plt.show() 

#Aunque displot seleciona eligio el grafico automaticamente
#tambien lo podemos hacer a traves de:
#kind='kde', de densidad

#A nivel de estilo uno de los mas usados son:
#legend=True
#palette='dark'
#alpha=0.25

image

Distribuciones

#Opciones para realizar distribuciones numericas en sns

#Importamos Seaborn
import seaborn as sns
import matplotlib.pyplot as plt

#Cargamos un dataset built-in sns
tips = sns.load_dataset('tips')

#Asi ejecutamos un histograma donde podemos ver 
#la frecuencia de los 'tip', esta frecuencia puede ser
#modificada usando los bins. 

#cumulative=True, permite que se vallan sumando las frecuencias
sns.histplot(data=tips, x='tip', bins=10, cumulative=True)
plt.show()

image

#Categorizamos el grafico a partir de hue='sex'

#Se puede graficar un estadistico especifico a partir de:
#stat='probability', stat='frecuency', stat='percent'
#stat='density', stat='count'-> defaul

#Indicamos como queremos presentar los datos
#multiple='stack', multiple='layer',multiple='dodge',multiple='fill'
#element="step"

sns.histplot(data=tips, x='tip', bins=10, cumulative=False, hue='sex'
,stat='probability', multiple='dodge')
plt.show()

image

#Grafico de densidad de tip, donde al parecer los
#hombres dejn mas propina que las mujeres

#Al igual que en el histograma podemos usar la propiedad
#cumulative=True/False
#shade=True, para sombrear el area bajo la curva
#bs_adjust=1, ajusta la grafica de acuerdo a los ejes

sns.kdeplot(data=tips, x='tip', hue='sex', shade=True)
plt.show()

image

#Grafico escalonado que indica las proporciones o tasa de cambio
#puede ser en base a a diferentes estadisticos 
sns.ecdfplot(data=tips, x='tip', hue='sex', stat='count')
plt.show()

image

#Displot se refiere a cualquier tipo de diagrama de distribucion.
sns.displot(data=tips, x='tip', hue='sex', stat='count')
plt.show()

image

Categóricos

#Graficos de variables categoricas
#Importamos Seaborn
import seaborn as sns
import matplotlib.pyplot as plt

#Cargamos un dataset built-in sns como 'tips'
tips = sns.load_dataset('tips')
#countplot es practicamente un hisplot/displot con 
#multiple='dodge' o dodge=True

sns.countplot(data=tips,x='day',hue='sex')
plt.show()

image

#stripplot requiere al menos:
#x, una variable categorica
#y, una distribucion numerica
#hue, otra variable categorica
#dodge, permite separar hue para que sea mas claro
sns.stripplot(data=tips,x='day',y='total_bill',hue='sex', dodge=True)
plt.show()

#En esta grafica vemos las distribucion de una variable numerica 
#respecto a una categorica como los dias

image

#swarmplot es como stripplot solo que se ve mas claro la
#consentracion, incluso tiene las mismas propiedades
sns.swarmplot(data=tips,x='day',y='total_bill',hue='sex', dodge=True)
plt.show()

image

#El boxplot indica la distribucion numerica por cuantiles
#podemos colocar dos grupos categoricos como se muestra:
sns.boxplot(data=tips,x='day',y='total_bill',hue='sex', dodge=True)
plt.show()

image

#En este grafico se sobreponen un swarmplot y un boxplot
#lo cual es interesante para relacionar cuantiles y consetracion.

plt.figure(figsize=(8,6))

sns.swarmplot(data=tips,x='day',y='total_bill',hue='sex', 
dodge=True,color='k', marker='>')

sns.boxplot(data=tips,x='day',y='total_bill',hue='sex', dodge=True)
plt.show()

image

#El violin es similar al boxplot, pero en vez de cuantiles, indica
#la consentracion de los datos es como swarmplot pero delineado .
sns.violinplot(data=tips,x='day',y='total_bill',hue='sex', dodge=True)
plt.show()

image

#La propiedad 'split' permite contrarestar la distribucion 
#de los datos a nivel de consentracion entre nuestra 
#variable categorica 'sex'

sns.violinplot(data=tips,x='day',y='total_bill'
,hue='sex',dodge=True,split=True)
plt.show()

image

#Categorical plot es una opcion universal como displot. 😊👽
#solo cambiando kind='box', kind='violin', etc..
#col, es una propiedad de catplot que nos permite dividir la grafica en dos
#graficas de forma categorica. 
sns.catplot(data=tips,x='day',y='total_bill',hue='sex',
            dodge=True,kind='box',col='time')

image

Archivos de la clase

#Graficos de relacion entre variables como scatterplot

#Importamos Seaborn
import seaborn as sns
import matplotlib.pyplot as plt

#Cargamos un dataset built-in sns como 'tips'
tips = sns.load_dataset('tips')

#scatterplot permite ver si eziste alguna asociacion entre variables
#con style, podemos agregar otra categoria ademas de hue
#size='size',podemos agregar otra categoria ademas de hue 
sns.scatterplot(data=tips, x='total_bill',y='tip'
, hue='sex',style='time',size='size')

#Usando legend posicionamos la legenda
plt.legend(loc='center', bbox_to_anchor=(1.15,0.5))
plt.show()

image\

#Crear un dicionario para la propiedad marker
#donde queremos que la categoria time tenga diferentes
#estilos de forma:

markers={'Lunch':'p','Dinner':'>'}

plt.figure(figsize=(7,5))
sns.scatterplot(data=tips, x='total_bill',y='tip'
, hue='day',style='time',size='size',markers=markers)

plt.legend(loc='center', bbox_to_anchor=(1.15,0.5))
plt.show()

image

#Lineplot es como un scatterplot pero unido con lineas
#como podemos ver es preferible el scatterplot
plt.figure(figsize=(7,5))
sns.lineplot(data=tips, x='total_bill',y='tip'
, hue='day',style='time',size='size',markers=markers)

image

#Relational plot es una opcion universal como displot. 😊👽
#solo cambiando kind='scatter', kind='line', etc..
plt.figure(figsize=(7,5))
sns.relplot(data=tips, x='total_bill',y='tip'
, hue='day',style='time',size='size',markers=markers, col='time')

image

Jointplot y Pairplot

#Importamos Seaborn
import seaborn as sns
import matplotlib.pyplot as plt

#Cargamos un dataset built-in sns como 'tips'
tips = sns.load_dataset('tips')

#jointplot es un grafico muy util para identificar tanto la 
#relacion entre variables como el histograma de cada una de ellas
#algo muy interesante de jointplot este podemos utilizar
#kind='hist',kind= 'kde', etc

sns.jointplot(data=tips,x='total_bill', y='tip'
,hue='sex')
plt.show()

image

#Usando las propiedades maginal_ticks=True,
#margina_kws=dict(bins=25, fill=False,multiple='dodge' podemos
#modificar el estilo de los graficos marginales sin afectar el 
#grafico principal y asi agregar mas contexto

sns.jointplot(data=tips,x='total_bill', y='tip', kind='hist'
,hue='sex',marginal_ticks=True, marginal_kws=dict(fill=False, multiple='dodge'))
plt.show()

image

#Pairplot permite visulizar relaciones numericas
#automaticamente identifica las mismas en nuestro dataset

#La propiedad 'corner=True' solo muestra la mitad de los graficos 
sns.pairplot(data=tips,hue='sex', kind='hist', palette='coolwarm',)
plt.show()

image

Heatmap

Mapas de colores que podemos trabajar con seaborn, heatmap

#Heatmap, es util al graficar datos en una estructura matricial.

#Importamos Seaborn
import seaborn as sns
import matplotlib.pyplot as plt

#Cargamos un dataset built-in sns como 'tips'
tips = sns.load_dataset('tips')

#A pertir de corr() optenemos la correlacion 
#entre los valores numericos de tips asi tenemos un tipo de matriz
tips.corr()

image

#Visualmente heatmap puede ser muy util para ver la correlacion 
#entre variables

#annot=True, indica el valor numerico de la correlacion
#cmap='coolwarm', color map, opciones de colores
#linewidth=5, lineas intermedias
#linecolor='black', cambia el color de las lineas intermedias 
#vmin=0,vmax=1, modifica la escala de los valores
#cbar=True, Valor default para mostrar la barra de escala

sns.heatmap(tips.corr(),annot=True,cmap='coolwarm',
            linewidth=5,linecolor='black',vmin=0.5,vmax=1,cbar=True)
plt.show()

image