修改Seaborn Line Relplot图例标题

时间:2018-11-02 10:12:00

标签: python seaborn

首先,我是Python和seaborn的新手,但是花了一些时间处理此事后,我相信我的问题尚未在其他地方得到解决。如果是这样,我表示诚挚的歉意。

我想将relplot()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);

它产生以下图形:

Example plot

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

此问题与Remove seaborn lineplot legend title的不同之处在于,relplot()kind='line'一起产生FacetGrid图形,并将图例附加到该图形上。这意味着我无法以g.ax.legend().texts的身份访问图例内容,而必须使用g._legend,在这种情况下我会迷路。

2 个答案:

答案 0 :(得分:4)

一个选项是使用processingPath = xxxObject.serverPath + "processing";将第一个图例条目设置为空字符串,然后使用g._legend.texts[0].set_text("")

g._legend.set_title('New title')

enter image description here

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

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

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

g._legend._legend_box.align = "right"  # or left, or center

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

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

答案 1 :(得分:0)

对我来说,g._legend.texts[0].set_text("") 删除了图例中 first 元素的标签,而不是标题。也许 seaborn 0.11.1 对 g._legend.texts[0] 的定义不同。

所以我干脆用了

g._legend.set_title("")