修改seaborn line relplot图例标题

Rob*_*ert 6 python seaborn

首先,我是 Python 和 seaborn 的新手,但是在花了一些时间处理这个问题之后,我相信我的问题没有在其他地方得到解决。如果是这样,我真诚地道歉。

我想使用 seabornrelplot()函数kind='line'将数据框中的数据绘制为多条不同颜色的行。与行相对应的数据由列中的值(cat例如)和我使用hue(在本例中为hue='cat')中的值分类分隔。这是一个简单的例子:

import pandas as pd
import seaborn as sns
df = pd.DataFrame({'x': [0, 1, 3, 4, 7, 1, 2, 5, 6],
                   'y': [2, 4, 3, 6, 5, 7, 10, 9, 7],
                   'cat': [0, 0, 0, 0, 0, 1, 1, 1, 1]})
g = sns.relplot(x='x', y='y', hue='cat', kind='line', data=df);
Run Code Online (Sandbox Code Playgroud)

它产生以下图形:

示例图

如何在不更改列名称的情况下修改图例标题cat?我相信我的问题是图例标题实际上是作为图例项目实现的,所以我想要做的是删除该项目,然后添加适当的图例标题(我可以使用g._legend.set_title('New title')),但我不知道如何完成这个。

这个问题不同于删除seaborn lineplot图例标题在于relplot()kind='line'产生FacetGrid图并附加图例那一个。这意味着我无法访问图例内容,g.ax.legend().texts但必须使用g._legend,在这种情况下我迷路了。

Dav*_*idG 10

一种选择是使用 将第一个图例条目设置为空字符串g._legend.texts[0].set_text(""),然后使用g._legend.set_title('New title')

import seaborn as sns
df = pd.DataFrame({'x': [0, 1, 3, 4, 7, 1, 2, 5, 6],
                   'y': [2, 4, 3, 6, 5, 7, 10, 9, 7],
                   'cat': [0, 0, 0, 0, 0, 1, 1, 1, 1]})
g = sns.relplot(x='x', y='y', hue='cat', kind='line', data=df)

g._legend.texts[0].set_text("")
g._legend.set_title("New title")
g._legend._legend_box.sep = -5  # move title down slightly

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

您还可以使用以下方法更改水平对齐方式:

g._legend._legend_box.align = "right"  # or left, or center
Run Code Online (Sandbox Code Playgroud)

另一种选择是自己绘制图例:

g = sns.relplot(x='x', y='y', hue='cat', kind='line', data=df, legend=False)
ax =g.axes[0][0]

for i, line in enumerate(ax.lines):
    line.set_label(i)

leg = ax.legend()
leg.set_title("New title")
Run Code Online (Sandbox Code Playgroud)

下面显示了将第一个图例条目设置为空字符串的替代方法(由评论中的 ImportanceOfBeingErnest 建议):

c = g._legend.get_children()[0].get_children()[1].get_children()[0]
c._children = c._children[1:]
Run Code Online (Sandbox Code Playgroud)