Déplacer la légende en dehors de la figure dans seaborn tsplot

je voudrais créer un graphique de séries chronologiques en utilisant seaborn.tsplot comme dans cet exemple tsplot documentation, mais avec la légende déplacée à droite, en dehors de la figure.

example

basé sur les lignes 339-340 dans seaborn de l'timeseries.py, il ressemble à seaborn.tsplot actuellement ne permet pas le contrôle direct du placement de légende:

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

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

16
demandé sur Sergey Antopolskiy 2015-05-27 21:47:26

3 réponses

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 la légende directement par matplotlib, en accord avec Matplotlib Légende 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

39
répondu Sergey Antopolskiy 2018-03-12 18:13:06

la réponse de Sergey a bien fonctionné pour moi en utilisant un seaborn.tsplot mais je n'étais pas en mesure de le faire fonctionner pour un seaborn.lmplot alors j'ai regardé un peu plus loin 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)

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

3
répondu T.W. 2017-05-23 11:46:33

j'ai essayé d'appliquer la réponse de T. W. pour Seaborn lineplot, sans succès. Quelques modifications à sa réponse ont fait l'affaire... au cas où quelqu'un cherche la version de lineplot comme j'é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

1
répondu pablo-az 2018-08-01 17:56:05