20 de Diciembre del 2022 | Jhonatan Montilla
Es posible que hayas intentado utilizar gráficos con FacetGrid, son hermosos, flexibles pero pueden ser difíciles de configurar, si eres analista de datos o científico de datos, necesitas compartir información y, a veces, debe hacerlo rápidamente, en esta publicación obtendrás muchas visualizaciones geniales usando Seaborn, y Pyplot (Matplotlib) y algunos trucos para mejorarlas. Usaremos datos aleatorios para el artículo, y usted puede crear algunos rápidamente usando una combinación de enteros aleatorios y variables categóricas aleatorias, para variables categóricas, usaré random.choice y para numeral random.randint
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
months = ['Jan', 'Feb', 'Sept']
n = 100
df = pd.DataFrame({
'device_id': np.random.randint(1,3,n),
'day': np.random.choice(days, n),
'month': np.random.choice(months, n),
'visits':np.random.randint(1,10000,n),
'revenue':np.random.randint(1000,100000,n)
})
df.head()
device_id | day | month | visits | revenue | |
---|---|---|---|---|---|
0 | 2 | Thu | Feb | 7285 | 76809 |
1 | 1 | Tue | Jan | 941 | 86466 |
2 | 1 | Sun | Feb | 9993 | 73944 |
3 | 2 | Mon | Feb | 1532 | 15656 |
4 | 2 | Fri | Sept | 814 | 47630 |
La primera recomendación para crear gráficos que impactarán a tu audiencia es construir tu paleta de colores. Al hacerlo, puede utilizar las pautas gráficas de su empresa y mostrar sus colores. Es sencillo de hacer, defina sus colores usando la codificación HEX establezca esta paleta en seaborn.
my_colors = ['#a7bed3','#ffcaaf','#f1ffc4','#c6e2e9','#dab894']
sns.set_palette(sns.color_palette(my_colors))
Puede hacer referencia a estos utilizando el parámetro de color de seaborn. Lo veremos en detalle en los siguientes apartados.
color = my_colors[0]
Seaborn, por defecto, puede pedir un poco al azar, o al menos no a tu gusto. Esto es aún más cierto con FaceGrid cuando se muestran varios gráficos. Afortunadamente, puede forzar los gráficos para que muestren el orden que necesita.
Para ordenar el eje del gráfico, puede utilizar el parámetro de orden de Seaborn.
ax = sns.FacetGrid(df,
col = 'device_id'
)
ax = ax.map(sns.countplot,
"day",
order = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
color = my_colors[0]
);
ax.set_xticklabels(rotation = 45)
<seaborn.axisgrid.FacetGrid at 0x1ed666b81c8>
A veces no se puede saber el pedido de antemano. Por ejemplo, si desea ordenar por una métrica agregada, digamos la suma de los ingresos.
Haremos uso de las variables categóricas para realizar esto:
En el siguiente código, extraje el pedido de la suma de los ingresos por día:
# 1) Definición del orden por los resultados de una agregación
order = list(df[['day',
"visits"]].groupby(['day']).sum().sort_values(by = "visits",
ascending = False).index.values
)
# 2/3) Transformar la variable ordenada en categoría
df['day'] = pd.Categorical(df['day'], categories = order, ordered = True)
fig = plt.figure(figsize = (15,4))
outcome_counts = df.groupby(['day',
'device_id']).size().rename('count').reset_index()
by_outcome = outcome_counts.pivot(columns = 'device_id',
values = 'count',
index = 'day'
)
# 4) Primer gráfico
ax1 = fig.add_subplot(1, 2, 1)
ax1 = by_outcome.div(by_outcome.sum(1),
axis = 0).plot.bar(stacked = True,
ax = ax1,
color = my_colors
);
# Segundo gráfico
ax2 = fig.add_subplot(1, 2, 2)
ax2 = df[['day',
"visits"]].groupby(['day']).sum().sort_index().plot.bar(ax = ax2,
legend = False,
color = my_colors[0]
)
display(fig.figure)
Otra característica útil de seaborn es mostrar múltiples gráficos en una cuadrícula. Esto puede ser particularmente relevante si desea comparar la densidad de numerosas variables o categorías.
Puedes hacerlo rápidamente usando la función FacetGrid. En el siguiente ejemplo, podemos analizar rápidamente si el patrón de visitas es similar a lo largo de los días.
sns.set(font_scale = 0.8)
ax = sns.FacetGrid(df,
col = 'day',
col_wrap = 4
)
ax = ax.map(sns.histplot,
"visits",
color = my_colors[0],
kde = True
);
No todos los gráficos predeterminados de Seaborn satisfarán sus necesidades. Afortunadamente esto no es un problema; ¡Son altamente personalizables!
A menudo necesito resaltar la Media o la Mediana de los datos que estoy analizando.
Para agregar la media a sus gráficos, puede usar la función personalizada a continuación. Esta pieza de código:
# 1) Muestra la gráfica
sns.set(font_scale = 0.8)
ax = sns.FacetGrid(df,
col = 'day',
col_wrap = 4
)
ax = ax.map(sns.histplot,
"visits",
color = my_colors[0],
kde = True
)
# 2) añadir una línea media/mediana
def custom(y, **kwargs):
max_y = (max([h.get_height() for h in sns.histplot(y,
color = my_colors[0]).patches]
)
)
ym = y.mean()
plt.axvline(ym,
color = my_colors[1],
linestyle = "dashed"
)
plt.annotate(f"mean: {y.mean():.2f}",
xy = (ym,
max_y * 0.9
),
ha = "right"
)
ax = ax.map(custom, "visits")