2016-08-14 2 views
0

Я пытался кодировать анимацию с помощью matplolibs FuncAnimation для создания модели, такой как изображение ниже, где каждый кадр круга меняет цвет от белого до серого и наоборот , Картина:TypeError: объект «NoneType» не является итерируемой ошибкой в ​​анимации matoplotlib

The model

Ниже приведен код. Рассмотрим h как список, содержащий отдельные списки, первый содержит круг для изменения в каждом кадре, а второй - начальные цвета кругов в виде отдельных строк «k» и «w». Пример для ч:

[[1,3,4,1.....]['k','w','k','w','w'....]] 

Код:

n=5 
fig = plt.figure(figsize=(n,n)) 
x =[i%n+1 for i in range(0,n**2)] 
y =[i/n+1 for i in range(n**2)] 
h=giving_data_for_visual(2,n,3,1,2) 
cl=h[1] 
colors='' 
for i in cl: 
    colors+=i 
changes_list=h[0] 
scat=plt.scatter(x, y,s=50,facecolors=colors, alpha=0.5) 

def update(frame): 
    global colors,change_list 
    t=(cl[changes_list[frame]]=='k') 
    cl[changes_list[frame]]='k' if t else 'w' 
    colors=cl 
    scat.set_facecolors(colors) 

ani=animation.FuncAnimation(fig, update, interval=10, blit=True,frames=len(changes_list)) 
plt.show() 

Импорт используется следующим образом (некоторые из них не предназначены для этой части программы):

from random import randint 
from random import uniform 
from math import exp 
from math import log 
import matplotlib.pyplot as plt 
import numpy as np 
from numpy import std 
from matplotlib import animation 

Однако, когда я запускаю код, появляется только первый кадр (что-то похожее на модель i, выложенное выше), и когда я закрываю его окно, появляется такая ошибка:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\Yael\Desktop\WinPython-64bit-2.7.10.2\python-2.7.10.amd64\lib\lib-tk\Tkinter.py", line 1536, in __call__ 
    return self.func(*args) 
    File "C:\Users\Yael\Desktop\WinPython-64bit-2.7.10.2\python-2.7.10.amd64\lib\lib-tk\Tkinter.py", line 587, in callit 
func(*args) 
    File "C:\Users\Yael\Desktop\WinPython-64bit-2.7.10.2\python-2.7.10.amd64\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 143, in _on_timer 
TimerBase._on_timer(self) 
    File "C:\Users\Yael\Desktop\WinPython-64bit-2.7.10.2\python-2.7.10.amd64\lib\site-packages\matplotlib\backend_bases.py", line 1290, in _on_timer 
ret = func(*args, **kwargs) 
    File "C:\Users\Yael\Desktop\WinPython-64bit-2.7.10.2\python-2.7.10.amd64\lib\site-packages\matplotlib\animation.py", line 925, in _step 
still_going = Animation._step(self, *args) 
    File "C:\Users\Yael\Desktop\WinPython-64bit-2.7.10.2\python-2.7.10.amd64\lib\site-packages\matplotlib\animation.py", line 784, in _step 
self._draw_next_frame(framedata, self._blit) 
    File "C:\Users\Yael\Desktop\WinPython-64bit-2.7.10.2\python-2.7.10.amd64\lib\site-packages\matplotlib\animation.py", line 802, in _draw_next_frame 
self._pre_draw(framedata, blit) 
    File "C:\Users\Yael\Desktop\WinPython-64bit-2.7.10.2\python-2.7.10.amd64\lib\site-packages\matplotlib\animation.py", line 815, in _pre_draw 
self._blit_clear(self._drawn_artists, self._blit_cache) 
    File "C:\Users\Yael\Desktop\WinPython-64bit-2.7.10.2\python-2.7.10.amd64\lib\site-packages\matplotlib\animation.py", line 853, in _blit_clear 
    axes = set(a.axes for a in artists) 
TypeError: 'NoneType' object is not iterable 

Я не могу решить эту ошибку. Заранее благодарю за любую помощь :).

ответ

0

The documentation of FuncAnimation говорит, что функция update должна возвращать измененные художники:

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

Вы можете изменить функцию

def update(frame): 
    global colors,change_list 
    t=(cl[changes_list[frame]]=='k') 
    cl[changes_list[frame]]='k' if t else 'w' 
    colors=cl 
    scat.set_facecolors(colors) 
    return scat 

Обратите внимание на последнюю строку, я добавил в свой код.

+0

спасибо. Теперь я чувствую себя ужасно глупым из-за отсутствия возвращения. – nyenyu

+0

Ну, не ясно, что функция должна что-то вернуть. –

Смежные вопросы