我写了一个Langton的蚂蚁代码,我想让动画在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
答案 0 :(得分:0)
您的代码似乎缺少更新。根据您的描述,您正在制作大量图而没有清除它们。查看一些标志的怪异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中也有小部件,并且有一个笔记本可以显示:https://colab.research.google.com/notebooks/widgets.ipynb
看起来您可以使用Bokeh制作动画,我不知道是否可行,但我100%确信可行。 https://colab.research.google.com/notebooks/charts.ipynb#scrollTo=nv8P3UYm6SiQ
答案 1 :(得分:0)
您可以在FuncAnimation参数中添加框架并使用以下命令。 尽管有限制,但这会增加动画中的某些帧。这仅仅是将动画限制提高到一个很大的值。
matplotlib.rcParams['animation.embed_limit'] = 2**128
答案 2 :(得分:-1)
啊啊,这花了我四个小时,但完全值得!
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'))