Move legend outside figure in seaborn tsplot

那年仲夏 提交于 2020-08-20 18:04:28

问题


I would like to create a time series plot using seaborn.tsplot like in this example from tsplot documentation, but with the legend moved to the right, outside the figure.

example

Based on the lines 339-340 in seaborn's timeseries.py, it looks like seaborn.tsplot currently doesn't allow direct control of legend placement:

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

Is there a matplotlib workaround? I'm using seaborn 0.6-dev.


回答1:


Indeed, seaborn doesn't handle legends well so far. You can use plt.legend() to control legend properties directly through matplotlib, in accordance with Matplotlib Legend Guide.

Note that in Seaborn 0.10.0 tsplot was removed, and you may replicate (with different values for the estimation if you please) the plots with lineplot instead of tsplot.

Snippet

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.lineplot(data=gammas, x="timepoint", y="BOLD signal", hue="ROI")

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

Output




回答2:


I tried to apply T.W.'s answer for seaborn lineplot, without success. A few modifications to his answer did the job... in case anyone is looking for the lineplot version as I was!

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




回答3:


The answer by Sergey worked great for me using a seaborn.tsplot but I was not able to get it working for an seaborn.lmplot so I looked a bit deeper and found another solution:

Example:

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)

Maybe you have to play around with the values to fit them to your legend. This answer will also be helpful if you need more examples.




回答4:


A pure seaborn solution:

FacetGrid-based Seaborn plots can do this automatically using the legend_out kwarg. Using relplot, pass legend_out to the FacetGrid constructor via the facet_kws dictionary:

import seaborn as sns

sns.set(style="darkgrid")

gammas = sns.load_dataset("gammas")

sns.relplot(
    data=gammas,
    x="timepoint",
    y="BOLD signal",
    hue="ROI",
    kind="line",
    facet_kws={"legend_out": True}
)



来源:https://stackoverflow.com/questions/30490740/move-legend-outside-figure-in-seaborn-tsplot

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!