我想在this example from tsplot
documentation中使用seaborn.tsplot
创建一个时间序列图,但图例移到右侧,图中。
基于seaborn's timeseries.py中的第339-340行,看起来seaborn.tsplot
目前不允许直接控制图例展示位置:
if legend:
ax.legend(loc=0, title=legend_name)
是否有matplotlib解决方法? 我正在使用seaborn 0.6-dev。
答案 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.)
答案 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()
答案 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}
)
答案 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中,这给了我类似的东西: