【问题标题】:Remove seaborn lineplot legend title删除 seaborn 线图图例标题
【发布时间】:2019-01-05 20:00:04
【问题描述】:

我想从我的 seaborn 线图图例中删除标题。我尝试使用this answer 无济于事:

import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
fmri = sns.load_dataset("fmri")
fig, ax = plt.subplots()
g = sns.lineplot(x="timepoint", y="signal", hue="event", data=fmri, ax=ax)
ax.legend().set_title('')

如果我尝试将标题设置为None,我会得到相同的结果。有趣的是,将标题设置为其他内容似乎会添加到现有标题的前面:

ax.legend().set_title('Something else')

看起来 seaborn 将标题视为隐藏的传奇条目。我该如何解决这个问题?

【问题讨论】:

    标签: python matplotlib seaborn line-plot


    【解决方案1】:

    重要:这个答案是关于使用 hue 并显示为图例标题的情况。在所有其他情况下,问题本身已经包含删除标题的常用方法。

    确实,seaborn 滥用了图例标签作为(子组)标题。因此,想法可以是删除此标签,或将其替换为自定义文本。

    用自定义文本替换:

    legend = ax.legend()
    legend.texts[0].set_text("Whatever else")
    

    移除标签:

    handles, labels = ax.get_legend_handles_labels()
    ax.legend(handles=handles[1:], labels=labels[1:])
    

    删除标签后,您当然还可以设置另一个(真实)标题:

    handles, labels = ax.get_legend_handles_labels()
    ax.legend(handles=handles[1:], labels=labels[1:], title="Whatever else")
    

    【讨论】:

    • 在所有列出的情况下,不再需要索引。 legend.texts[0].set_text("Whatever else") -> legend.texts.set_text("Whatever else") ax.legend(handles=handles[1:], labels=labels[1:], ... -> ax.legend(handles=handles, labels=labels, ...
    • @AtifRaza 这是不正确的。第一个建议会导致错误。第二个建议不会删除标题。
    • 我还需要更改图例标题,但您的建议是删除图例标题以及第一个图例条目。在您发表评论后再次检查ax.legend(handles=handles, labels=labels, title="Split"),对于Seaborn 0.9.0,我确信从[1:] 索引是不正确的。如果我们有版本不匹配,也许你可以检查一下。
    • @badluck 的 answer 也在解决同样的问题。
    • @AtifRaza 这个答案用 seaborn 0.8、0.9 和 0.10 进行了测试。它适用于其中的每一个。
    【解决方案2】:
    import seaborn as sns
    g = sns.lineplot(x="myXs", y="myYs", hue="myHue", data=mydf)
    g.legend_.set_title(None)
    

    【讨论】:

    • 除了直接通过legend_访问图例实例,您还可以使用适当的getter函数:g.get_legend().set_title(None)g.legend().set_title(None)
    【解决方案3】:

    Extending ImportanceOfBeingErnest 的回答:

    我遇到了同样的问题,但“删除标签”示例从实际图例中删除了标题和第一项。

    handles, labels = ax.get_legend_handles_labels()
    ax.legend(handles=handles[1:], labels=labels[1:])
    

    所以,这只会删除图例标题:

    handles, labels = ax.get_legend_handles_labels()
    ax.legend(handles=handles, labels=labels)
    

    【讨论】:

    • 您不需要切片索引 ([0:]),因为它没有效果。我认为您的解决方案只是重新创建图例而不指定标题。这假设您首先有一个图例标题,seaborn 没有使用。您是否需要此解决方案来专门修复 seaborn 绘图?
    猜你喜欢
    • 2017-08-26
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2022-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多