在 matplotlib 中获取一条线的图例标签

And*_*ott 2 python matplotlib

鉴于我在 matplotlib 中有一个线对象,我如何获得该线的图例标签?

get_label()Artist 类的方法仅在图例未更改或创建标签(使用plt.legend()或类似)时才有效。

可以使用 获取与行关联的处理程序Legend.get_legend_handler(),但这与任何文本无关。 Legend.get_lines()给出了一个线对象列表......但它们与绘制的对象不同。

如何get_label()不起作用的示例:

x = [0,1]
y = [1,1]
line, = plt.plot(x,y)
plt.legend(("hello",))
plt.plot()

line.get_label() # returns '_line0'
Run Code Online (Sandbox Code Playgroud)

有没有人有任何想法?

Imp*_*est 5

没有通用的方法可以知道图例是否包含给定艺术家的标签。艺术家可以有或没有自定义标签,这不一定需要与图例中使用的标签一致。

因此,解决方案将始终取决于假设。

A.如果我们假设给艺术家一个标签,并且这个标签是图例中显示的标签,那么解决方案很简单:

line.get_label()
Run Code Online (Sandbox Code Playgroud)

B.如果我们假设线条的创建顺序与它们在图例中出现的顺序相同,并且中间没有其他艺术家,我们可以这样做

def get_label_for_line(line):
    leg = line.axes.get_legend()
    ind = line.axes.get_lines().index(line)
    return leg.texts[ind].get_text()
Run Code Online (Sandbox Code Playgroud)

C.如果我们假设图例是直接从艺术家(而不是其他代理艺术家)创建的,我们可以比较标签,例如

def get_label_for_line(line):
    leg = line.axes.get_legend()
    for h, t in zip(leg.legendHandles, leg.texts):
        if h.get_label() == line.get_label():
            return t.get_text()
Run Code Online (Sandbox Code Playgroud)

对于其他解决方案,人们需要更多地了解图形、其艺术家和图例是如何创建的。