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

Xin*_*ang 6 python matplotlib

我想在 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()
Run Code Online (Sandbox Code Playgroud)

SED*_*dji 5

您必须在动画函数中返回图例才能渲染它。试试这个:

legend = plt.legend()
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))
    legend.remove()
    legend = plt.legend()
    return lines + [legend]
Run Code Online (Sandbox Code Playgroud)

您还应该在 init 函数中包含相同的代码,在调整窗口大小时使用 init ,否则调整大小时图例将消失


hol*_*roy 4

我根本不是 matplotlib 方面的专家,但在双摆动画中,它们显示的文本会发生变化,这会导致一些变化,这可以帮助您。

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

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

或者将 a 添加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)]
Run Code Online (Sandbox Code Playgroud)

并更改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
Run Code Online (Sandbox Code Playgroud)

这会将文本放置在靠近右上角的位置,并针对每个动画步骤进行更新。由于线条仍然显示其图例,因此您可以简化为仅显示舞台的文本。但我将消息的微调留给您自行决定。

附录:延长 Line2D

另一种选择可能在动画中扩展lines.Line2D和使用这些线条,类似于本文。不确定这是否适用于动画,但如果您无法使上述工作正常,这可能值得一试。