在Matplotlib中获取线条图例标签

4
考虑到我在matplotlib中有一个线对象,如何获得该线的图例标签?
Artist类的get_label()方法仅在图例未更改或创建标签(使用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'

有人有什么想法吗?


不清楚:get_label()将给出行的标签。这将是图例中使用的标签。为什么这不是你要找的?记住,制作一个问题的 [mcve] 总是有帮助的 - 在这种情况下创建一些代码并显示它产生了什么。明确说明代码应该产生什么结果。 - ImportanceOfBeingErnest
我编辑了这篇文章。如果该行是通过标签创建的,get_label()仅返回该行的标签。使用legend()调用创建图例标签不会修改线条以添加标签,因此无法正常工作。 - Andrew Spott
但是你自己创建了标签,所以你已经知道它是“hello”了吗?! - ImportanceOfBeingErnest
是的,因为你要求一个人为的例子。我正在修复matplotlib2tikz中的一个错误,这需要从图形对象重新创建绘图。我无法访问创建绘图的代码。 - Andrew Spott
好的,但是您是否可以访问图例? - ImportanceOfBeingErnest
您可以使用 line.axes.get_legend() 获取图例。 - Andrew Spott
1个回答

9

没有一种普遍的方法可以知道一个图例是否包含给定艺术家的标签。艺术家可以有自定义标签,也可以没有,并且这并不一定需要与图例中使用的标签相一致。

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

A. 如果我们假设艺术家被赋予了一个标签,并且这个标签是在图例中显示的标签,那么解决方案就很容易:

line.get_label()

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()

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()

对于其他解决方案,我们需要更多地了解这个图形、它的艺术家以及传说是如何创建的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接