一尘不染

如何在python动画中添加图例/标签

python

我想在python动画中添加图例,如下line.set_label()所示。它类似于plt.plot(x,y,label='%d' %*variable*)

但是,我发现代码在这里不起作用。该动画仅显示变化的行,但没有可用的标签或图例。我该如何解决这个问题?

 from matplotlib import pyplot as plt 
 from matplotlib import animation

fig = plt.figure()

ax = plt.axes(xlim=(0, 2), ylim=(0, 100))

N = 3
lines = [plt.plot([], [])[0] for _ in range(N)]


def init():    
    for line in lines:
        line.set_data([], [])
    return lines

def animate(i):
    for j,line in enumerate(lines):
        line.set_data([0, 2], [10*j,i])
        line.set_label('line %d, stage %d'%(j,i))
    return lines

anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=100, interval=20, blit=True)

plt.show()

阅读 615

收藏
2021-01-20

共1个答案

一尘不染

我根本不是matplotlib的专家,但是在Double
Pendulum动画中,
它们显示变化的文本,这会导致一些变化,可以为您提供帮助。

要获得具有实际线条颜色的图例,可以将初始设置更改lines为:

lines = [plt.plot([], [], label = 'line {}'.format(i))[0] for i in range(N)]

或在函数中line.set_label()for循环中添加一个init()。这些似乎都按预期工作。至少如果您在plt.legend(loc="upper left")之前添加plt.show()

但是,set_label它在animate()函数中不起作用,但是根据链接的动画,您可以使用添加到动画中的特定文本字段,这似乎效果很好。在初始化之后添加以下代码lines

texts = [ax.text(0.80, 0.95-i*0.05,  '', transform=ax.transAxes) for i in range(N)]

并更改animate()为:

def animate(i):
    for j in range(N):
        lines[j].set_data([0, 2], [10*j,i]) #, label="hei {}".format(i))
        texts[j].set_text('line %d, stage %d'%(j,i))
    return lines

这会将文本放在右上角附近,并针对每个动画步骤进行更新。由于这些行仍显示其图例,因此您可以简化为一个仅显示舞台的文本。但是,我会根据您的判断对消息进行微调。

附录:扩展Line2D

另一个选择 可能
lines.Line2D在动画中扩展和使用这些行,类似于本文的内容。不知道这是否可以与动画一起使用,但是如果您不能使以上内容起作用,那么可能值得尝试。

2021-01-20