Python 在Colab中是否有一种动态生成动画的方法?

Python 在Colab中是否有一种动态生成动画的方法?,python,animation,google-colaboratory,Python,Animation,Google Colaboratory,我编写了一个Langton的ant代码,我想让动画在Colab中运行,直到用户停止或在一定数量的帧后停止。就像现在一样,它首先生成所有帧,然后将它们编译成动画,然后显示。如果有很多帧,则需要花费很长时间和/或Colab内存不足。这就是为什么我希望有一种方法,一次只生成一帧,并不断更新图像。 看起来FuncAnimation并没有那个功能,但也许我只是没看到而已。 如果有人知道一个方法或文件,这将是有益的,请让我知道 import numpy as np import matplotlib.pyp

我编写了一个Langton的ant代码,我想让动画在Colab中运行,直到用户停止或在一定数量的帧后停止。就像现在一样,它首先生成所有帧,然后将它们编译成动画,然后显示。如果有很多帧,则需要花费很长时间和/或Colab内存不足。这就是为什么我希望有一种方法,一次只生成一帧,并不断更新图像。 看起来FuncAnimation并没有那个功能,但也许我只是没看到而已。 如果有人知道一个方法或文件,这将是有益的,请让我知道

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation, rc, colors
from IPython.display import HTML

N = 40
ant = np.array([N//2, N//2])
move = {'N': [0, 1], 'E': [1, 0], 'S': [0, -1], 'W': [-1, 0]}
d = ['N', 'E', 'S', 'W']
facing = 1
board = np.zeros((N, N))
color = 0
board[ant[0]][ant[1]] = 4

cmap = colors.ListedColormap(['darkgreen', 'limegreen', 'greenyellow', 'yellow', 'red'])


def turn(direction):
    if direction == 'R':
        return (facing + 1) % 4
    else:
        return (facing - 1) % 4


def update(data):
    global ant, board, facing, color
    if color in [0, 1]:
        facing = turn('R')
    else:
        facing = turn('L')

    board[ant[0]][ant[1]] = (color + 1) % 4
    ant += move[str(d[facing])]
    color = board[ant[0]][ant[1]]
    board[ant[0]][ant[1]] = 4

    mat.set_data(board)
    return [mat]

fig, ax = plt.subplots(figsize=(5, 5));

ax.grid(False)
plt.axis('off')

mat = ax.matshow(board, cmap=cmap)
ani = animation.FuncAnimation(fig, update, frames = 150, interval = 1, repeat=False, blit=True)

rc('animation', html='jshtml')
ani

啊,这花了我四个小时,但完全值得

out = display(Image.fromarray((cmap(board)*255.0).astype('uint8'),'RGBA'), display_id=True)
for i in range(200):
    #print(cmap(board))
    time.sleep(0.1)
    update(board)
    image=Image.fromarray(cmap(board),'RGBA')
    out.update(Image.fromarray((cmap(board)*255).astype('uint8'),'RGBA'))

您的代码似乎缺少更新。根据你的描述,你在没有清除它们的情况下,正在绘制大量的情节。看看这些奇怪的gif标志

from IPython.display import SVG, display
out=display(SVG(url='http://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg'), display_id=True)
while True:
    out.update(SVG(url='https://upload.wikimedia.org/wikipedia/commons/f/fa/Flag_of_the_People%27s_Republic_of_China.svg'))
    out.update(SVG(url='http://upload.wikimedia.org/wikipedia/en/a/a4/Flag_of_the_United_States.svg'))
这里的关键部分是out.update。你有一个更新功能

空间

看起来Goolge Colab中也存在小部件,它们有一个笔记本可以显示:

看起来你可以用Bokeh制作动画,我不知道这是否可行,但我百分之百肯定这是可能的。

您可以在FuncAnimation参数中添加帧,并使用以下命令。 虽然有限制,但这将增加动画中的某些帧。这只是将动画限制提高到一个较大的值

matplotlib.rcParams['animation.embed_limit'] = 2**128

我还是很生气你否决了我的第一条评论。不管怎样,你的答案就在这里: