J'essaie de recréer l'intrigue suivante de l'ouvrage Introduction to Statistical learning using seaborn
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])
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}}
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])