ArtistAnimation具有不同帧速率的子图

时间:2018-01-16 13:48:40

标签: python matplotlib

考虑以下代码,该代码实现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()

在这种情况下,im1im2中的项目数相同,每个子图的帧速率相同。

现在,假设我有2个列表,其中包含不同的项目数,并且我希望ArtistAnimate能够在相同的总时间内浏览这些帧。最初我想到在interval调用中操纵ArtistAnimation关键字,但这意味着您可以为不同的艺术家设置不同的时间间隔,我认为这是不可能的。

无论如何,我认为基本的想法非常明确len(im1)不等于len(im2),但动画需要在相同的时间内完成所有这些。

请问有什么办法吗?感谢

修改

当我尝试下面提供的答案时,我应该补充一点,因为我的数据结构,我宁愿使用ArtistAnimation。如果没有替代方案,我将回复到下面的解决方案。

1 个答案:

答案 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()