web-dev-qa-db-fra.com

Déplacer la légende à l'extérieur de la figure dans le tsplot de Seaborn

Je voudrais créer un tracé de série temporelle en utilisant seaborn.tsplot comme dans cet exemple de la documentation tsplot , mais avec la légende déplacée vers la droite, en dehors de la figure.

example

Basé sur les lignes 339-340 dans timesborn.py de seaborn , il ressemble à seaborn.tsplot ne permet actuellement pas de contrôler directement l'emplacement des légendes:

    if legend:
        ax.legend(loc=0, title=legend_name)

Existe-t-il une solution de contournement matplotlib? J'utilise Seaborn 0.6-dev.

34
bnelsj

En effet, seaborn ne gère pas bien les légendes jusqu'à présent. Vous pouvez utiliser plt.legend() pour contrôler les propriétés de légende directement via matplotlib, conformément à Matplotlib Legend Guide .

Exemple:

import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="darkgrid")

# Load the long-form example gammas dataset
gammas = sns.load_dataset("gammas")

# Plot the response with standard error
sns.tsplot(data=gammas, time="timepoint", unit="subject",
           condition="ROI", value="BOLD signal")

# Put the legend out of the figure
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

Modified legend position

72
Sergey Antopolskiy

J'ai essayé d'appliquer la réponse de T.W.pour lineborn plot , sans succès. Quelques modifications à sa réponse ont fait l'affaire ... au cas où quelqu'un chercherait la version lineplot comme je l'étais!

import seaborn as sns
import pandas as pd

# load data
df = sns.load_dataset("gammas")

# EDIT: I Needed to ad the fig
fig, ax1 = plt.subplots(1,1)

# EDIT: 
# T.W.' answer said: "create with hue but without legend" <- # I needed to include it!
# So, removed: legend=False
g = sns.lineplot(x="timepoint", y="BOLD signal", hue="ROI", data=df, ax=ax1) 

# EDIT: 
# Removed 'ax' from T.W.'s answer here aswell:
box = g.get_position()
g.set_position([box.x0, box.y0, box.width * 0.85, box.height]) # resize position

# Put a legend to the right side
g.legend(loc='center right', bbox_to_anchor=(1.25, 0.5), ncol=1)

plt.show()

Seaborn Lineplot with Legend outside

6
pablo-az

La réponse de Sergey a très bien fonctionné pour moi en utilisant un seaborn.tsplot mais je n'ai pas réussi à le faire fonctionner pour un seaborn.lmplot donc j'ai regardé un peu plus profondément et j'ai trouvé une autre solution:

Exemple:

import seaborn as sns
import pandas as pd

# load data
df = pd.DataFrame.from_csv('mydata.csv')

# create with hue but without legend
g = sns.lmplot(x="x_data", y="y_data", hue="condition", legend=False, data=df)

# resize figure box to -> put the legend out of the figure
box = g.ax.get_position() # get position of figure
g.ax.set_position([box.x0, box.y0, box.width * 0.85, box.height]) # resize position

# Put a legend to the right side
g.ax.legend(loc='center right', bbox_to_anchor=(1.25, 0.5), ncol=1)

sns.plt.show(g)

Vous devez peut-être jouer avec les valeurs pour les adapter à votre légende. This réponse sera également utile si vous avez besoin de plus d'exemples.

3
T.W.