4

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

  1. 为什么 dieinitanimatefunction 都需要在只回馈后使用逗号PLOT
  2. 为什么我的代码不更新time_text?如果我让它在每个动画之后打印 t,我会在控制台中正确添加一个,但文本不会在情节中更新。

.

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()
4

3 回答 3

4

1)不太清楚你的意思。在两者中initanimate都需要返回PLOTtime_text,所以你用逗号分隔它们,这样每个函数都会返回一个元组。

对于 'hanging' 逗号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让它显示在屏幕中间。

于 2013-08-06T15:18:40.037 回答
1

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

initand的 return 语句animate仅在blit=True使用时才严格需要。这些函数预计会返回一个可迭代的艺术家来更新动画。有两位艺术家,回报可能看起来像

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

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

return artist1,
# or 
return [artist1]
于 2018-02-10T23:11:15.950 回答
0

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

在这种情况下,该函数返回一个长度为 1 的可枚举,因此省略逗号会使 PLOT 成为可枚举。使用逗号符号,元组 PLOT 的内容与返回值的内容相匹配。

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

于 2015-02-18T12:52:27.427 回答