5 votes

Comment déplacer la légende dans Seaborn FacetGrid en dehors de la parcelle ?

J'ai le code suivant :

g = sns.FacetGrid(df, row="Type", hue="Name", size=3, aspect=3)
g = g.map(sns.plt.plot, "Volume", "Index")
g.add_legend()
sns.plt.show()

On obtient ainsi le graphique suivant :

enter image description here

Comment puis-je déplacer la légende en dehors du tracé ?

6voto

bernie Points 44206

Vous pouvez le faire en redimensionnant les parcelles :

g = sns.FacetGrid(df, row="Type", hue="Name", size=3, aspect=3)
g = g.map(sns.plt.plot, "Volume", "Index")
for ax in g.axes.flat:
    box = ax.get_position()
    ax.set_position([box.x0,box.y0,box.width*0.9,box.height])

sns.plt.legend(loc='center left',bbox_to_anchor=(1,0.5))
sns.plt.show()

Ejemplo:

import seaborn as sns

tips = sns.load_dataset('tips')

# more informative values
condition = tips['smoker'] == 'Yes'
tips['smoking_status'] = ''
tips.loc[condition,'smoking_status'] = 'Smoker'
tips.loc[~condition,'smoking_status'] = 'Non-Smoker'

g = sns.FacetGrid(tips,row='sex',hue='smoking_status',size=3,aspect=3)
g = g.map(plt.scatter,'total_bill','tip')
for ax in g.axes.flat:
    box = ax.get_position()
    ax.set_position([box.x0,box.y0,box.width*0.85,box.height])

sns.plt.legend(loc='upper left',bbox_to_anchor=(1,0.5))
sns.plt.show()

Résultats dans :

enter image description here

5 votes

Le module 'seaborn' n'a pas d'attribut 'plt'. obsolète ?

1 votes

@Rockbar, il suffit de laisser tomber 'sns'--voir stackoverflow.com/questions/47989743/

3 votes

Non, ce n'est pas suffisant pour seaborn 0.10.0. Matplotlib ne trouve pas de "handles with labels found to put in legend". Il faut utiliser g._legend .

3voto

AGavin Points 33

En suivant la documentation de Seaborn, vous pouvez ajouter l'arg legend_out=True à votre appel et cela devrait régler le problème

https://seaborn.pydata.org/generated/seaborn.FacetGrid.html

Votre code serait alors le suivant

g = sns.FacetGrid(df, row="Type", hue="Name", size=3, aspect=3, legend_out=True)
g = (g.map(plt.plot, "Volume", "Index").add_legend())
plt.show()

0voto

Florian Krause Points 21

Selon le commentaire de mwaskom ci-dessus, il s'agit d'un bogue dans OS X. En effet, le passage à un autre backend résout le problème.

Par exemple, j'ai mis ceci dans mon matplotlibrc :

backend : TkAgg   # use Tk with antigrain (agg) rendering

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X