某些绘图工具(例如seaborn
)会自动标记绘图并添加图例。使用ax.get_legend().remove()
删除图例非常容易,但是句柄和标签仍然存储在axis对象中的某个位置。因此,当添加我要为其添加图例的另一条线或其他图类型时,也会显示“旧”图例手柄和标签。换句话说:ax.get_legend_handles_labels()
仍返回f.i引入的标签和句柄。海上的。
是否可以从轴上完全移除手柄和标签?
这样ax.get_legend_handles_labels()
返回([], [])
?
我知道我可以将sns.lineplot(..., legend=False)
设置为seaborn。我只是用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_
对象,例如使用ax.legend_.legendHandles = []
,可以设置标签,文本和其他所有内容,但每次都会重新出现“旧的”旧条目。
由于这是打算在模块中使用的,因此不适用显式设置仅包含“均值”条目的图例。我需要“清除”后端发生的所有事情,以便为用户提供干净的API。
答案 0 :(得分: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())
将返回空的可迭代对象。
答案 1 :(得分:0)
感谢mullinscr考虑线图的答案。要删除一般的图例标签,必须清除lines
,collections
(散点图),patches
(箱形图等)和images
(显示等)的标签:
for _artist in ax.lines + ax.collections + ax.patches + ax.images:
_artist.set_label(s=None)
请告诉我,如果我忘了提到一种特定的情节。