【问题标题】:remove legend handles and labels completely完全删除图例句柄和标签
【发布时间】:2020-09-24 08:56:54
【问题描述】:

seaborn 等一些绘图工具会自动标记绘图并添加图例。使用ax.get_legend().remove() 删除图例相当容易,但句柄和标签仍存储在轴对象中的某个位置。因此,当添加另一条线或其他绘图类型时,我想要为其添加一个图例,“旧”图例句柄和标签也会显示。换句话说:ax.get_legend_handles_labels() 仍然返回 f.i. 引入的标签和句柄。海生。

有没有办法完全删除轴上用于图例的句柄和标签? 这样ax.get_legend_handles_labels() 返回([], [])

我知道我可以在 seaborn 中设置sns.lineplot(..., legend=False)。我只是在使用 seaborn 来制作一个很好的例子。问题是一般如何移除现有的图例标签和句柄。

这是一个最小的工作示例:

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

df = pd.DataFrame(data={
    'x': [0, 1, 0, 1], 
    'y': [7.2, 10., 11.2, 3.],
    'id': [4, 4, 7, 7]
})
# get mean per x location:
grpd = df.groupby('x').mean()

ax = sns.lineplot(data=df, x='x', y='y', hue='id', palette=['b', 'g'])
ax.get_legend().remove()

# this still returns the handles and labels:
print(ax.get_legend_handles_labels())
# Out: 
# ([<matplotlib.lines.Line2D at 0x17c1c208f88>,
#   <matplotlib.lines.Line2D at 0x17c1c1f8888>,
#   <matplotlib.lines.Line2D at 0x17c1c20af88>],
#  ['id', '4', '7'])

# plot some other lines, for which I want to have a legend:
ax.plot(grpd.index, grpd['y'], label='mean')
# add legend, ONLY FOR MEAN, if possible:
ax.legend()

我尝试操作坐标轴 ax.get_legend()ax.legend_ 对象,f.i.使用ax.legend_.legendHandles = [],设置标签、文本和其他所有内容,但“旧”的 seaborn 条目每次都会重新出现。

由于这是在模块中使用的,因此不适用明确设置仅包含“均值”条目的图例。我需要“清除”后端发生的所有事情,以便为用户提供干净的 API。

【问题讨论】:

    标签: python matplotlib seaborn


    【解决方案1】:

    变化:

    ax = sns.lineplot(data=df, x='x', y='y', hue='id', palette=['b', 'g'])
    

    到:

    ax = sns.lineplot(data=df, x='x', y='y', hue='id', palette=['b', 'g'], legend=False)
    

    这样您也不需要调用来删除图例,因为一开始就没有创建任何图例。

    编辑更新:

    如果您想清除图例句柄和标签,我认为您必须执行以下操作:

    for line in ax.lines: # put this before you call the 'mean' plot function.
        line.set_label(s='')
    

    这将遍历绘图上绘制的线条,然后将它们的标签设置为空。这样图例就不会考虑它们,print(ax.get_legend_handles_labels()) 将返回空的可迭代对象。

    【讨论】:

    • 感谢您的回答!请查看我在您发布答案前一分钟添加的编辑。我猜你在我附加信息时已经在写这个答案了。 :)
    • 非常感谢!这解决了线图的问题。对于点图和其他图(删除一般的图例条目),我将在几分钟内发布您的解决方案的一个小扩展。
    【解决方案2】:

    感谢 mullinscr 考虑线图的答案。一般来说,要删除图例标签,linescollections(f.i. 散点图)、patches(箱线图等)和images(imshow 等)的标签必须被清除:

    for _artist in ax.lines + ax.collections + ax.patches + ax.images:
        _artist.set_label(s=None)
    

    如果我忘记提及特定类型的情节,请告诉我。

    【讨论】:

      【解决方案3】:

      另一种选择是执行以下操作:

      ax.legend(handles=[], labels= [])
      

      在这种情况下,所有内容都将被删除。

      例如,如果您只想删除第一个句柄,您可以执行以下操作:

      1. 获取绘图的句柄和标签:
      h, l = ax.get_legend_handles_labels()*
      
      1. 选择你想要的(这里除了第一个):
      ax.legend(handles=[item for item in h[1:], labels= [item for item in l[1:])
      

      这样,你就可以整理出你想要的东西了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-09
        • 2011-08-27
        • 2018-07-05
        • 1970-01-01
        • 2016-10-07
        • 2021-02-09
        • 1970-01-01
        相关资源
        最近更新 更多