Python Matplotlib FuncAnimation

时间:2013-08-06 14:47:47

标签: python animation matplotlib

您好亲爱的StackOverfloooow成员, 我无法理解matplotlib的FuncAnimation模块。你介意帮我一点吗?我有两个问题:

  1. 为什么在仅仅回复init后,animatePLOT函数都需要逗号?
  2. 为什么我的代码不会更新time_text?如果我在每个动画之后让它打印出来,我会在控制台中添加一个,但是文本没有在图中更新。
  3. import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import animation
    
    fig = plt.figure()
    sub = fig.add_subplot(111,xlim=(0, 10), ylim=(0, 1))
    PLOT, = sub.plot([],[])
    time_text = sub.text(1,1,"",transform = sub.transAxes, ha="right")
    t = 0
    
    def init():
        PLOT.set_data([],[])
        time_text.set_text("")
        return PLOT,time_text
    
    def animate(i):
        global t
        x = np.linspace(0,10,1000)
        y = np.exp(- ((x-0.01*i)/(2))**2 )/np.sqrt(2*np.pi)
        t += 1
    
        PLOT.set_data(x,y)
        time_text.set_text("time = "+str(t))
        return PLOT, time_text
    
    ani = animation.FuncAnimation(fig, animate, init_func=init, frames=2000, interval=20, blit=True)
    
    plt.show()
    

3 个答案:

答案 0 :(得分:3)

1)不确定你的意思。在initanimate中,您需要同时返回PLOTtime_text,因此请使用逗号分隔它们,以便每个函数都返回一个元组。

对于PLOT, = sub.plot([],[])中的“悬挂”逗号,sub.plot返回一个包含单个元素matplotlib.lines.Line2D对象的列表。 PLOT,正在解压缩此单个元素列表。所以,你也可以这样做:

PLOT = sub.plot([],[])[0]

获取元素。

2)您的代码确实更新time_text,您只是将其绘制出图表的范围。例如更改:

time_text = sub.text(1,1,"",transform = sub.transAxes, ha="right")

要:

time_text = sub.text(1,0,"",transform = sub.transAxes, ha="right")

要让它显示在右下角,或0.5, 0.5让它显示在屏幕中间。

答案 1 :(得分:1)

其他答案并不能完全回答第一个问题。

仅在使用init时才需要animateblit=True的返回声明。这些函数预计会返回一个可迭代的艺术家来更新动画。有两位艺术家,回归可能看起来像

return artist1, artist2
# or 
return [artist1, artist2]

如果要更新单个艺术家,则必须记住仍然需要迭代。在那个单独的艺术家之后使用逗号只是让函数返回可迭代的最简单方法

return artist1,
# or 
return [artist1]

答案 2 :(得分:0)

在python中,使用括号和逗号编写元组,例如: (3,2) 这是一个2元组。一个元组将是(2,),其长度为1.这与int 2不同,int 2根本没有定义长度。 注意:()是具有空内容的0元组。

在这种情况下,函数返回一个长度为1的枚举,所以 省略逗号将使PLOT成为可枚举的。用逗号分隔 元组PLOT的内容与返回值的内容相匹配。

括号可以在赋值中省略,因此PLOT与(PLOT)相同。