代码之家  ›  专栏  ›  技术社区  ›  Raksha

在colab中有动态生成动画的方法吗?

  •  2
  • Raksha  · 技术社区  · 6 年前

    我写了一个兰顿的Ant代码,我想让这个动画在colab中运行,直到它被用户停止或者在一定数量的帧之后。现在,它首先生成所有帧,然后将它们编译成动画,然后显示出来。如果有很多帧,它需要永远和/或colab耗尽内存。这就是为什么我希望有一种方法可以一次生成一帧图像并不断更新图像。 看起来不像是滑稽化有这种能力,但也许我只是没看到而已。 如果有人知道有帮助的方法或文档,请告诉我。

    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
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   Emmanuel Lopez    6 年前

    似乎您的代码缺少更新。根据你的描述,你要在不清理的情况下进行大量的阴谋。看看这个奇怪的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制作动画,我不知道这是否可行,但我百分之百肯定这是可能的。 https://colab.research.google.com/notebooks/charts.ipynb#scrollTo=nv8P3UYm6SiQ

        2
  •  -1
  •   Emmanuel Lopez    6 年前

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

    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'))