簡體   English   中英

如何在matplotlib中通過func停止FuncAnimation?

[英]How to stop FuncAnimation by func in matplotlib?

我編寫了一個matplotlib動畫程序,如下所示:

def animate(frame):
    observation = env.render()
    action = RL.choose_action(str(observation)) # TODO
    action = [random.randint(0, 4) for i in range(ROBOT_NUM)] # TO BE DELETE TODO
    env.step(action)
    observation_ = env.render()
    reward = env.reward
    RL.learn(str(observation), action, reward, str(observation_))  # TODO
    for i in range(TARGET_NUM):
        patchs_target[i].center = (env.targets[i].x, env.targets[i].y)
    for i in range(ROBOT_NUM):
        patchs[i].center = (env.robots[i].x, env.robots[i].y)
        patchs_inner[i].center = (env.robots[i].x, env.robots[i].y)
    return patchs + patchs_inner + patchs_target

.....

anim = animation.FuncAnimation(fig, animate, init_func=init,frames=1, interval=UPDATE_INTERVAL, blit=True)

現在我想通過判斷animate函數中的條件來停止animation.FuncAnimation 例如, if reward < 10則停止animation.FuncAnimation ,但是我不知道如何處理。
或者是否有任何方法可以按條件停止animation.FuncAnimation 而不是動畫時間。

兩種選擇:

(1)使用發電機

為了動態地控制動畫,可以使用生成器,只要滿足某些條件,該生成器就會在while循環中產生新值。 可能如下所示:

reward = 0

def gen():
    global reward
    i = 0
    while reward <= 10:
        i += 1
        yield i

def animate(i):
    global reward
    reward = update(reward)
    some_object[i] = func(reward)
    return some_object

anim = animation.FuncAnimation(fig, animate, frames=gen, repeat = False)

(2)使用帶有event_source.stop()的類。

或者,您可以使用anim.event_source.stop()停止動畫。 為了能夠訪問動畫功能內的動畫,可以使用一個類並將動畫設置為類變量。

class Anim():
    def __init__(self, fig, **kw):
        self.reward=0
        self.ani = animation.FuncAnimation(fig, self.animate, 
                                           frames=100, repeat = False) 

    def animate(self,i):
        reward = update(reward)
        some_object[i] = func(reward)
        if self.reward > 10:
            self.ani.event_source.stop()
        return some_object

請注意,這兩個代碼都未經測試,因為問題沒有提供測試用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM