seaborn no está tramando dentro de subtramas definidas
Estoy intentando trazar dos distribuciones una al lado de la otra con este código.
fig,(ax1,ax2) = plt.subplots(1,2)
sns.displot(x =X_train['Age'], hue=y_train, ax=ax1)
sns.displot(x =X_train['Fare'], hue=y_train, ax=ax2)
Devuelve el siguiente resultado (dos subtramas vacías seguidas de una distribución cada una en dos líneas):
Si intento el mismo código con violinplot, devuelve el resultado esperado
fig,(ax1,ax2) = plt.subplots(1,2)
sns.violinplot(y_train, X_train['Age'], ax=ax1)
sns.violinplot(y_train, X_train['Fare'], ax=ax2)
¿Por qué displot devuelve un tipo de resultado diferente y qué puedo hacer para generar dos gráficos en la misma línea?
Aceptado
seaborn.distplot
ha sidoDEPRECATED
incorporadoseaborn 0.11
y es reemplazado por lo siguiente:displot()
, una función a nivel de figura con una flexibilidad similar sobre el tipo de gráfico a dibujar. Este es unFacetGrid
, y no tiene elax
parámetro, por lo que no funcionará conmatplotlib.pyplot.subplots
.histplot()
, una función a nivel de ejes para trazar histogramas, incluido el suavizado de densidad del núcleo. Esto tiene elax
parámetro, por lo que funcionará conmatplotlib.pyplot.subplots
.
- Es aplicable a cualquiera de las
seaborn
FacetGrid
parcelas que no tengan ningúnax
parámetro. Utilice el gráfico equivalente a nivel de ejes.- Consulte la documentación del gráfico a nivel de figura para encontrar la función de gráfico a nivel de ejes adecuada para sus necesidades.
- Ver funciones a nivel de figura versus funciones a nivel de ejes
- Nivel de figura:
relplot
,displot
,catplot
- Nivel de figura:
- Debido a que se desea el histograma de dos columnas diferentes, es más fácil de usar
histplot
. - Consulte Cómo trazar en múltiples subtramas para conocer varias formas diferentes de trazar
maplotlib.pyplot.subplots
- También revise seaborn histplot y el resultado de displot no coincide
- Probado en
seaborn 0.11.1
&matplotlib 3.4.2
fig, (ax1, ax2) = plt.subplots(1, 2)
sns.histplot(x=X_train['Age'], hue=y_train, ax=ax1)
sns.histplot(x=X_train['Fare'], hue=y_train, ax=ax2)
Importaciones y muestra de marco de datos
import seaborn as sns
import matplotlib.pyplot as plt
# load data
penguins = sns.load_dataset("penguins", cache=False)
# display(penguins.head())
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
0 Adelie Torgersen 39.1 18.7 181.0 3750.0 MALE
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 FEMALE
2 Adelie Torgersen 40.3 18.0 195.0 3250.0 FEMALE
3 Adelie Torgersen NaN NaN NaN NaN NaN
4 Adelie Torgersen 36.7 19.3 193.0 3450.0 FEMALE
Gráfico de nivel de ejes
- Con los datos en un formato amplio, utilice
sns.histplot
.ravel
,.flatten
y.flat
todos convierten laaxes
matriz a 1-D.- ¿Cuál es la diferencia entre las funciones aplanar y deshilachar en numpy?
- gran diferencia entre plano y ravel()
- Cómo arreglar el objeto 'numpy.ndarray' no tiene el atributo 'get_figure' al trazar subtramas
# select the columns to be plotted
cols = ['bill_length_mm', 'bill_depth_mm']
# create the figure and axes
fig, axes = plt.subplots(1, 2)
axes = axes.ravel() # flattening the array makes indexing easier
for col, ax in zip(cols, axes):
sns.histplot(data=penguins[col], kde=True, stat='density', ax=ax)
fig.tight_layout()
plt.show()
Gráfico de nivel de figura
- Con el marco de datos en un formato largo, use
displot
# create a long dataframe
dfl = penguins.melt(id_vars='species', value_vars=['bill_length_mm', 'bill_depth_mm'], var_name='bill_size', value_name='vals')
# display(dfl.head())
species bill_size vals
0 Adelie bill_length_mm 39.1
1 Adelie bill_depth_mm 18.7
2 Adelie bill_length_mm 39.5
3 Adelie bill_depth_mm 17.4
4 Adelie bill_length_mm 40.3
# plot
sns.displot(data=dfl, x='vals', col='bill_size', kde=True, stat='density', common_bins=False, common_norm=False, height=4, facet_kws={'sharey': False, 'sharex': False})
Múltiples marcos de datos
- Si hay varios marcos de datos, se pueden combinar con
pd.concat
y usar.assign
para crear una'source'
columna de identificación, que se puede usar pararow=
,col=
ohue=
# list of dataframe
lod = [df1, df2, df3]
# create one dataframe with a new 'source' column to use for row, col, or hue
df = pd.concat((d.assign(source=f'df{i}') for i, d in enumerate(lod, 1)), ignore_index=True)
- Consulte Importar varios archivos csv a pandas y concatenarlos en un marco de datos para leer varios archivos en un único marco de datos con una columna de identificación.