Есть ли в Colab способ динамически генерировать анимацию? - PullRequest
0 голосов
/ 03 октября 2018

Я написал код муравья Лэнгтона и хотел, чтобы анимация запускалась в 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

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Кажется, в вашем коде отсутствует обновление.По твоему описанию ты делаешь кучу сюжетов, не очищая их.Посмотрите на эту странную гифку с флагами

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

0 голосов
/ 17 ноября 2018

Аааа, это заняло у меня четыре часа, но оно того стоило!

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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...