2013-12-17 39 views
4

感谢您抽出时间来阅读我的问题,我已经张贴SO所以这里去第一次......Matplotlib动画多行和文本

我使用matplotlib.animation.FuncAnimation动画绘制时间序列数据

我通过遍历列表并从numpy数组中切片数据来绘制多条线。 这工作正常,但我也想添加文字到动画剧情和描述帧数。

我已在下面包含示例代码。

我正在尝试从animate函数返回一个线对象列表一个文本对象。 我收到一个属性错误,当我尝试这样做:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python27\lib\lib-tk\Tkinter.py", line 1470, in __call__ 
    return self.func(*args) 
    File "C:\Python27\lib\lib-tk\Tkinter.py", line 531, in callit 
    func(*args) 
    File "C:\Python27\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 141, in _on_timer 
    TimerBase._on_timer(self) 
    File "C:\Python27\lib\site-packages\matplotlib\backend_bases.py", line 1117, in _on_timer 
    ret = func(*args, **kwargs) 
    File "C:\Python27\lib\site-packages\matplotlib\animation.py", line 773, in _step 
    still_going = Animation._step(self, *args) 
    File "C:\Python27\lib\site-packages\matplotlib\animation.py", line 632, in _step 
    self._draw_next_frame(framedata, self._blit) 
    File "C:\Python27\lib\site-packages\matplotlib\animation.py", line 652, in _draw_next_frame 
    self._post_draw(framedata, blit) 
    File "C:\Python27\lib\site-packages\matplotlib\animation.py", line 675, in _post_draw 
    self._blit_draw(self._drawn_artists, self._blit_cache) 
    File "C:\Python27\lib\site-packages\matplotlib\animation.py", line 688, in _blit_draw 
    if a.axes not in bg_cache: 
AttributeError: 'list' object has no attribute 'axes' 

但是,说我有两个线对象的列表,如果我单独返回的对象,例如

return lines[0],lines[1], timetext 

我没有收到任何错误。

任何想法?

干杯 凡妮莎

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

npdata = numpy.random.randint(100, size=(5,6,10)) 
plotlays, plotcols = [2,5], ["black","red"] 

fig = plt.figure() 
ax = plt.axes(xlim=(0, numpy.shape(npdata)[0]), ylim=(0, numpy.max(npdata))) 
timetext = ax.text(0.5,50,'') 

lines = [] 
for index,lay in enumerate(plotlays): 
    lobj = ax.plot([],[],lw=2,color=plotcols[index])[0] 
    lines.append(lobj) 

def init(): 
    for line in lines: 
     line.set_data([],[]) 
    return lines 

def animate(i): 
    timetext.set_text(i) 
    x = numpy.array(range(1,npdata.shape[0]+1)) 
    for lnum,line in enumerate(lines): 
     line.set_data(x,npdata[:,plotlays[lnum]-1,i]) 
    return lines, timetext 

anim = animation.FuncAnimation(fig, animate, init_func=init, 
           frames=numpy.shape(npdata)[1], interval=100, blit=True) 

plt.show() 
+0

您可以请发布完整的追溯? – aIKid

回答

5
def animate(i): 
    timetext.set_text(i) 
    x = numpy.array(range(1,npdata.shape[0]+1)) 
    for lnum,line in enumerate(lines): 
     line.set_data(x,npdata[:,plotlays[lnum]-1,i]) 
    return lines, timetext # <- returns a tuple of form (list, artist) 

改变这

 return tuple(lines) + (timetext,) 

或相似的,所以你从animate返回艺术家的迭代东西。

+0

传奇!谢谢tcaswell。 – user3109337

+0

如果你有时间,你能解释为什么你必须将这些对象打包成一个元组才能返回它们吗?还有什么区别(对我的例子)timetext和timetext,? – user3109337

+0

你需要返回一个可迭代的艺术家,它可以是一个列表或一个元组。我没有特殊原因使用元组而不是列表。 '([line1,line2],text)'vs'(line1,line2,text)' – tacaswell