web-dev-qa-db-fra.com

Tracer plusieurs parcelles différentes sur une même figure avec Seaborn

J'essaie de recréer l'intrigue suivante de l'ouvrage Introduction to Statistical learning using seaborn enter image description here

Je veux spécifiquement recréer ceci en utilisant lmplot de Seaborn pour créer les deux premiers graphes et boxplot pour créer le second. Le problème principal est que lmplot crée un facetgrid selon à cette réponse , ce qui m'oblige à ajouter hackily un autre axe matplotlib pour la boîte à moustaches. Je me demandais s'il y avait un moyen plus facile d'y parvenir. Ci-dessous, je dois faire un peu de manipulation manuelle pour obtenir le tracé souhaité.

seaborn_grid = sns.lmplot('value', 'wage', col='variable', hue='education', data=df_melt, sharex=False)
seaborn_grid.fig.set_figwidth(8)

left, bottom, width, height = seaborn_grid.fig.axes[0]._position.bounds
left2, bottom2, width2, height2 = seaborn_grid.fig.axes[1]._position.bounds
left_diff = left2 - left
seaborn_grid.fig.add_axes((left2 + left_diff, bottom, width, height))

sns.boxplot('education', 'wage', data=df_wage, ax = seaborn_grid.fig.axes[2])
ax2 = seaborn_grid.fig.axes[2]
ax2.set_yticklabels([])
ax2.set_xticklabels(ax2.get_xmajorticklabels(), rotation=30)
ax2.set_ylabel('')
ax2.set_xlabel('');

leg = seaborn_grid.fig.legends[0]
leg.set_bbox_to_anchor([0, .1, 1.5,1])

Ce qui donne enter image description here

Exemple de données pour DataFrames:

df_melt = {'education': {0: '1. < HS Grad',
  1: '4. College Grad',
  2: '3. Some College',
  3: '4. College Grad',
  4: '2. HS Grad'},
 'value': {0: 18, 1: 24, 2: 45, 3: 43, 4: 50},
 'variable': {0: 'age', 1: 'age', 2: 'age', 3: 'age', 4: 'age'},
 'wage': {0: 75.043154017351497,
  1: 70.476019646944508,
  2: 130.982177377461,
  3: 154.68529299562999,
  4: 75.043154017351497}}

df_wage={'education': {0: '1. < HS Grad',
  1: '4. College Grad',
  2: '3. Some College',
  3: '4. College Grad',
  4: '2. HS Grad'},
 'wage': {0: 75.043154017351497,
  1: 70.476019646944508,
  2: 130.982177377461,
  3: 154.68529299562999,
  4: 75.043154017351497}}
23
Ted Petrou

Une possibilité serait de ne PAS utiliser lmplot(), mais d'utiliser directement regplot(). regplot() trace sur les axes que vous passez en argument avec ax=.

Vous perdez la possibilité de fractionner automatiquement votre jeu de données en fonction d'une certaine variable, mais si vous connaissez à l'avance les tracés que vous souhaitez générer, cela ne devrait pas poser de problème.

Quelque chose comme ça:

fig, axs = plt.subplots(ncols=3)
sns.regplot(x='value', y='wage', data=df_melt, ax=axs[0])
sns.regplot(x='value', y='wage', data=df_melt, ax=axs[1])
sns.boxplot(x='education',y='wage', data=df_melt, ax=axs[2])
49
Diziet Asahi