matplotlib 完全删除图例控点和标注

nkoocmlb  于 2023-03-03  发布在  其他
关注(0)|答案(3)|浏览(255)

一些绘图工具,如seaborn,会自动标记绘图并添加图例。使用ax.get_legend().remove()删除图例相当容易,但句柄和标签仍然存储在axis对象中的某个地方。因此,当添加另一条线或其他绘图类型时,我希望为其添加图例,“旧”图例句柄和标签也会显示。换句话说:ax.get_legend_handles_labels()仍然返回由f.i. seaborn引入的标签和句柄。
有没有办法完全删除轴上图例的句柄和标签?这样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 = [],设置标签,文本和其他一切,但“旧的”海运条目每次都在重新应用。
因为这意味着要在模块中使用,所以显式设置只包含“mean”条目的图例是不适用的。我需要“清除”后端发生的一切,以便为用户提供一个干净的API。

gojuced7

gojuced71#

变更:

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())将返回空的可迭代对象。

vom3gejh

vom3gejh2#

感谢mullinscr提供的关于线图的答案。要删除图例标签,必须清除linescollections(f.i.散点图)、patches(箱线图等)和images(imshow等)的标签:

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

请告诉我,如果我忘了提到一种具体的情节。

wmtdaxz3

wmtdaxz33#

另一个选项是执行以下操作:

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:])

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

相关问题