【问题标题】:Modify seaborn line relplot legend title修改seaborn line relplot图例标题
【发布时间】:2018-11-02 10:12:00
【问题描述】:

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

我想使用 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);

它会生成以下图表:

如何修改图例标题而不更改列名cat?我相信我的问题是图例标题实际上是作为图例项目实现的,所以我想做的是删除该项目,然后添加一个正确的图例标题(我可以使用g._legend.set_title('New title')),但我不知道如何做到这一点。

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

【问题讨论】:

    标签: python seaborn


    【解决方案1】:

    一种选择是使用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()
    

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

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

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

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

    将第一个图例条目设置为空字符串的替代方法如下所示(由 cmets 中的 ImportanceOfBeingErnest 建议):

    c = g._legend.get_children()[0].get_children()[1].get_children()[0]
    c._children = c._children[1:]
    

    【讨论】:

    • 谢谢!这行得通。我也想知道是否可以删除第一个图例项,但如果不能,我会使用它!
    • @RobertNyqvist 不完全确定您可以仅使用 seaborn 将其删除。我认为另一种选择是自己创建传奇。我已经用那个选项更新了我的答案。
    • @RobertNyqvist 那么我现在会坚持我的答案中的第一种方式,并等待看看是否有其他人知道更好的方式
    • 嗯,没有remove方法,但是你可以清空packer,比如g._legend.get_children()[0].get_children()[1].get_children()[0].get_children()[0]._children = []
    • 或者更好c = g._legend.get_children()[0].get_children()[1].get_children()[0]; c._children = c._children[1:]
    【解决方案2】:

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

    所以我简单地使用了

    g._legend.set_title("")
    

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2020-12-10
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 2021-09-25
      • 2019-01-05
      • 2017-08-26
      相关资源
      最近更新 更多