seaborn no está tramando dentro de subtramas definidas

Resuelto callmeanythingyouwant asked hace 4 años • 1 respuestas

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):

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

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)

ingrese la descripción de la imagen aquí

¿Por qué displot devuelve un tipo de resultado diferente y qué puedo hacer para generar dos gráficos en la misma línea?

callmeanythingyouwant avatar Sep 15 '20 12:09 callmeanythingyouwant
Aceptado
  • seaborn.distplotha sido DEPRECATEDincorporado seaborn 0.11y 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 un FacetGrid, y no tiene el axpará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 el axparámetro, por lo que funcionará conmatplotlib.pyplot.subplots .
  • Es aplicable a cualquiera de las seaborn FacetGridparcelas que no tengan ningún axpará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
  • 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 trazarmaplotlib.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, utilicesns.histplot
  • .ravel, .flatteny .flattodos convierten la axesmatriz 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()

ingrese la descripción de la imagen aquí

Gráfico de nivel de figura

  • Con el marco de datos en un formato largo, usedisplot
# 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.concaty usar .assignpara crear una 'source'columna de identificación, que se puede usar para row=, 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.
Trenton McKinney avatar Sep 15 '2020 05:09 Trenton McKinney