2016-01-28 154 views
1

我想使用FuncAnimation和circle.set_radius()来制作一个扩展圆的动画。但是,仅当blit = False时,动画才起作用。其代码如下:Matplotlib FuncAnimation,blit = true时出错。

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import animation 

fig, ax = plt.subplots() 
plt.grid(True) 
plt.axis([-0.6, 0.6, -0.6, 0.6]) 
circle1= plt.Circle([0,0],0.01,color="0.",fill=False, clip_on = True) 
ax.add_patch(circle1) 

dt = 1.0/20 
vel = 0.1 

def init(): 
    circle1.set_radius(0.01) 

def animate(i): 
    global dt, vel 
    r = vel * i * dt 
    circle1.set_radius(r) 
    return circle1, 

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

它返回此错误:

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/site-packages/matplotlib/artist.py", line 61, in draw_wrapper 
    draw(artist, renderer, *args, **kwargs) 
    File "/usr/local/lib/python2.7/site-packages/matplotlib/figure.py", line 1139, in draw 
    self.canvas.draw_event(renderer) 
    File "/usr/local/lib/python2.7/site-packages/matplotlib/backend_bases.py", line 1809, in draw_event 
    self.callbacks.process(s, event) 
    File "/usr/local/lib/python2.7/site-packages/matplotlib/cbook.py", line 562, in process 
    proxy(*args, **kwargs) 
    File "/usr/local/lib/python2.7/site-packages/matplotlib/cbook.py", line 429, in __call__ 
    return mtd(*args, **kwargs) 
    File "/usr/local/lib/python2.7/site-packages/matplotlib/animation.py", line 620, in _start 
    self._init_draw() 
    File "/usr/local/lib/python2.7/site-packages/matplotlib/animation.py", line 1166, in _init_draw 
    for a in self._drawn_artists: 
TypeError: 'NoneType' object is not utterable 

我使用Mac OS。当我改变blit = False时,动画将起作用。但是,只要我移动鼠标,动画就会减慢。这是有问题的,因为我有一个单独的线程生成声音输出。在实践中,圈子会碰到一些数据点并发出声音。结果他们不同步。请帮忙。

回答

0

From the docs

If blit=True, func and init_func should return an iterable of drawables to clear.

所以 - 你需要添加return circle1,给你的函数init()。另一种选择是在拨打FuncAnimation时根本不指定init_func - 您可能不需要它。如果没有它,动画可能会做你想要的。

circle1后的尾部逗号 - 这意味着一个(1种元素)的元组被返回,以便根据需要返回值是可迭代。您已在animate函数中拥有此功能。

相关问题