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.
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.
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.)
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()
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.