考虑以下代码,该代码实现ArtistAnimation
以在同一图形对象中为两个不同的子图设置动画。
import numpy as np
import itertools
import matplotlib.pyplot as plt
import matplotlib.mlab as ml
import matplotlib.animation as animation
def f(x,y,a):
return ((x/a)**2+y**2)
avals = np.linspace(0.1,1,10)
xaxis = np.linspace(-2,2,9)
yaxis = np.linspace(-2,2,9)
xy = itertools.product(xaxis,yaxis)
xy = list(map(list,xy))
xy = np.array(xy)
x = xy[:,0]
y = xy[:,1]
fig, [ax1,ax2] = plt.subplots(2)
ims = []
for a in avals:
xi = np.linspace(min(x), max(x), len(x))
yi = np.linspace(min(y), max(y), len(y))
zi = ml.griddata(x, y, f(x, y, a), xi, yi, interp='linear') # turn it into grid data, this is what imshow takes
title = plt.text(35,-4,str(a), horizontalalignment = 'center')
im1 = ax1.imshow(zi, animated = True, vmin = 0, vmax = 400)
im2 = ax2.imshow(zi, animated=True, vmin=0, vmax=400)
ims.append([im1,im2, title])
ani = animation.ArtistAnimation(fig, ims, interval = 1000, blit = False)
plt.show()
在这种情况下,im1
和im2
中的项目数相同,每个子图的帧速率相同。
现在,假设我有2个列表,其中包含不同的项目数,并且我希望ArtistAnimate
能够在相同的总时间内浏览这些帧。最初我想到在interval
调用中操纵ArtistAnimation
关键字,但这意味着您可以为不同的艺术家设置不同的时间间隔,我认为这是不可能的。
无论如何,我认为基本的想法非常明确len(im1)
不等于len(im2)
,但动画需要在相同的时间内完成所有这些。
请问有什么办法吗?感谢
修改
当我尝试下面提供的答案时,我应该补充一点,因为我的数据结构,我宁愿使用ArtistAnimation
。如果没有替代方案,我将回复到下面的解决方案。
答案 0 :(得分:1)
是的,有点可能,使用Funcanimation
并将您的数据封装在func
中。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
arr1 = np.random.rand(300,3,4)
arr2 = np.random.rand(200,5,6)
fig, (ax1, ax2) = plt.subplots(1,2)
img1 = ax1.imshow(arr1[0])
img2 = ax2.imshow(arr2[0])
# set relative display rates
r1 = 2
r2 = 3
def animate(ii):
if ii % r1:
img1.set_data(arr1[ii/r1])
if ii % r2:
img2.set_data(arr2[ii/r2])
return img1, img2
ani = animation.FuncAnimation(fig, func=animate, frames=np.arange(0, 600))
plt.show()