如何为子图绘制动画图例?
How to draw animated legend for subplots?
我想用 ArtistAnimation 绘制动画子图。不幸的是,我不知道如何制作动画图例。我尝试了在 Whosebug 上找到的不同方法。如果我设法得到一个图例,它不是动画的,而是所有动画步骤的图例。
我的代码如下所示:
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])
我得到一个 AttributeError: 'Line2D' object has no attribute '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()
我想用 ArtistAnimation 绘制动画子图。不幸的是,我不知道如何制作动画图例。我尝试了在 Whosebug 上找到的不同方法。如果我设法得到一个图例,它不是动画的,而是所有动画步骤的图例。
我的代码如下所示:
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])
我得到一个 AttributeError: 'Line2D' object has no attribute '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()