Python 如何为子地块绘制动画图例?

Python 如何为子地块绘制动画图例?,python,animation,matplotlib,legend,subplot,Python,Animation,Matplotlib,Legend,Subplot,我想用艺术化的方法画动画的子情节。不幸的是,我不知道如何制作动画传奇。我尝试了在StackOverflow上找到的不同方法。如果我设法得到一个图例,它不是动画,而是所有动画步骤的图例 我的代码如下所示: import numpy as np import pylab as pl import matplotlib.animation as anim fig, (ax1, ax2, ax3) = pl.subplots(1,3,figsize=(11,4)) ims = [] im1 =

我想用艺术化的方法画动画的子情节。不幸的是,我不知道如何制作动画传奇。我尝试了在StackOverflow上找到的不同方法。如果我设法得到一个图例,它不是动画,而是所有动画步骤的图例

我的代码如下所示:

import numpy as np
import pylab as pl
import matplotlib.animation as anim

fig, (ax1, ax2, ax3) = pl.subplots(1,3,figsize=(11,4))
ims   = []
im1   = ['im11','im12','im13']
im2   = ['im21','im22','im23']
x = np.arange(0,2*np.pi,0.1)

n=50
for i in range(n):
    for sp in (1,2,3):
        pl.subplot(1,3,sp)

        y1 = np.sin(sp*x + i*np.pi/n)
        y2 = np.cos(sp*x + i*np.pi/n)

        im1[sp-1], = pl.plot(x,y1)
        im2[sp-1], = pl.plot(x,y2)

        pl.xlim([0,2*np.pi])
        pl.ylim([-1,1])

        lab = 'i='+str(i)+', sp='+str(sp)
        im1[sp-1].set_label([lab])
        pl.legend(loc=2, prop={'size': 6}).draw_frame(False)

    ims.append([ im1[0],im1[1],im1[2], im2[0],im2[1],im2[2] ])

ani = anim.ArtistAnimation(fig,ims,blit=True)
pl.show()

我原以为这段代码与这里使用的方法相同,但显然我遗漏了一些东西

我还尝试按照中的建议设置标签,但我真的不知道如何在我的案例中使用它。像这样

im2[sp-1].legend(handles='-', labels=[lab])
我得到一个
属性错误:“Line2D”对象没有属性“legend”


[编辑]:我没有明确说明:我希望在绘图中两行都有一个图例。

我不知道图例应该是什么样子,但我想你只是想让它显示当前帧中一行的当前值。因此,最好更新线的数据,而不是绘制150个新的绘图

import numpy as np
import pylab as plt
import matplotlib.animation as anim

fig, axes = plt.subplots(1,3,figsize=(8,3))
ims   = []
im1   = [ax.plot([],[], label="label")[0] for ax in axes]
im2   = [ax.plot([],[], label="label")[0] for ax in axes]
x = np.arange(0,2*np.pi,0.1)

legs = [ax.legend(loc=2, prop={'size': 6})  for ax in axes]

for ax in axes:
    ax.set_xlim([0,2*np.pi])
    ax.set_ylim([-1,1])
plt.tight_layout()
n=50
def update(i):
    for sp in range(3):
        y1 = np.sin((sp+1)*x + (i)*np.pi/n)
        y2 = np.cos((sp+1)*x + (i)*np.pi/n)

        im1[sp].set_data(x,y1)
        im2[sp].set_data(x,y2)

        lab = 'i='+str(i)+', sp='+str(sp+1)
        legs[sp].texts[0].set_text(lab)
        legs[sp].texts[1].set_text(lab)

    return im1 + im2 +legs 

ani = anim.FuncAnimation(fig,update, frames=n,blit=True)
plt.show()

我的最小示例似乎有点太小了。:)我想要两行的图例。我可以添加
legs2
并手动将其移动到正确位置,但它不会自动与第二个(此处:橙色)数据关联。到目前为止,我更喜欢循环版本(而不是使用
def
),因为实际上,我正在处理30000个
I
s的数据,必须跳过其中的大部分。有没有办法在
update(i)
中包含类似
continue
break
的条件?使用
frames=something
给定的
i
调用
update
函数与在something中调用
i的循环相同。因此,我认为这没有任何问题。当然,您也可以根据上面的代码进行艺术化,只需将图例添加到艺术家列表中即可。我用两个图例条目更新了答案。我没有设法让它与ArtistAnimation一起工作,但使用带有综合列表的
frames=n
完成了这项工作。谢谢