2015-05-27 3 views
8

Ich möchte ein Zeitreihendiagramm mit seaborn.tsplot wie in this example from tsplot documentation erstellen, aber mit der Legende nach rechts bewegt, außerhalb der Abbildung.Move Legende außerhalb Abbildung in Seaborn tsplot

example

Basierend auf den Linien 339-340 in seaborn's timeseries.py, es sieht aus wie seaborn.tsplot derzeit nicht die direkte Kontrolle der Legende Platzierung ermöglichen:

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

Gibt es eine matplotlib Abhilfe? Ich benutze Seaborn 0.6-dev.

+2

Ich denke, wenn Sie 'ax.legend' erneut aufrufen, wird es neu zeichnen, nicht eine zweite hinzufügen. – mwaskom

+0

@mwaskom: Funktioniert für mich. Vielen Dank! – bnelsj

Antwort

20

In der Tat, seaborn verarbeitet Legenden bisher nicht gut. Sie können plt.legend() verwenden, um Legendeneigenschaften direkt über matplotlib gemäß Matplotlib Legend Guide zu steuern.

Beispiel:

import matpltlib.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

+0

Die letzte Zeile ist die Lösung. Es hat auch für meinen Barplot funktioniert. – Denziloe

0

Die Antwort von Sergey funktionierte großartig für mich ein seaborn.tsplot verwenden, aber ich war nicht in der Lage es für ein seaborn.lmplot arbeiten zu bekommen, so sah ich ein bisschen tiefer und fand eine andere Lösung:

Beispiel:

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) 

Vielleicht musst du mit den Werten herumspielen, um sie an deine Legende anzupassen. This Antwort wird auch hilfreich sein, wenn Sie weitere Beispiele benötigen.