在seaborn tsplot中将图例移到图外

时间:2015-05-27 18:47:27

标签: matplotlib seaborn

我想在this example from tsplot documentation中使用seaborn.tsplot创建一个时间序列图,但图例移到右侧,图中。

example

基于seaborn's timeseries.py中的第339-340行,看起来seaborn.tsplot目前不允许直接控制图例展示位置:

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

是否有matplotlib解决方法? 我正在使用seaborn 0.6-dev。

5 个答案:

答案 0 :(得分:64)

事实上,seaborn到目前为止还没有很好地处理传说。您可以使用plt.legend()根据Matplotlib Legend Guide直接通过matplotlib控制图例属性。

示例:

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

答案 1 :(得分:5)

我尝试将T.W.的答案应用于季节性线图,但没有成功。对他的答案进行了一些修改就完成了工作...以防万一有人像我一样寻找线图版本!

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

答案 2 :(得分:3)

谢尔盖的答案对我使用seaborn.tsplot很有帮助,但是我无法让它为seaborn.lmplot工作,所以我看得更深一些,找到了另一个解决方案:

示例:

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)

也许你必须要使用这些值来适应你的传奇。 如果您需要更多示例,This答案也会有所帮助。

答案 3 :(得分:3)

seaborn解决方案:

基于

FacetGrid的Seaborn图可以使用legend_out kwarg自动执行此操作。使用relplot,通过legend_out字典将FacetGrid传递给facet_kws构造函数:

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

Example plot with legend placement outside using FacetGrid.

答案 4 :(得分:2)

通过对location参数使用“错误”的东西,现有的解决方案似乎使事情变得不必要地复杂。考虑一下传说相对于锚点的位置。例如,如果您想在图例的右侧显示,则锚点位置就是其center left

我们可以将Sergey Antopolskiy的答案简化为:

import seaborn as sns

# Load the long-form example gammas dataset
g = sns.lineplot(data=gammas, x="timepoint", y="BOLD signal", hue="ROI")

# Put the legend out of the figure
g.legend(loc='center left', bbox_to_anchor=(1, 0.5))

bbox_to_anchor表示我们希望锚定在右侧(即x轴上的1)和垂直居中(y轴上的0.5)。 loc说,我们希望图例位于此锚点的左中角。

在Seaborn版本0.11.0中,这给了我类似的东西:

tidy example