<p>如果您有较新版本的Matplotlib,则有一个<a href="http://matplotlib.org/api/animation_api.html#matplotlib.animation.FuncAnimation" rel="nofollow">^{<cd1>} class</a>,它可以帮助减少一些锅炉板代码。(例如,<a href="http://matplotlib.org/examples/animation/histogram.html" rel="nofollow">See this page</a>)非常快(~<strong>52帧每秒</strong>):</p>
<pre><code>import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import timeit
clock = timeit.default_timer
fig, ax = plt.subplots()
alphab = ['A', 'B', 'C', 'D', 'E', 'F']
frequencies = [1, 44, 12, 11, 2, 10]
pos = np.arange(len(alphab))
width = 1.0 # gives histogram aspect to the bar diagram
ax.set_xticks(pos + (width / 2))
ax.set_xticklabels(alphab)
rects = plt.bar(pos, frequencies, width, color='r')
start = clock()
def animate(arg, rects):
frameno, frequencies = arg
for rect, f in zip(rects, frequencies):
rect.set_height(f)
print("FPS: {:.2f}".format(frameno / (clock() - start)))
def step():
for frame, bin_idx in enumerate(np.linspace(0,1000000,100000000), 1):
#Here we just change the first bin, so it increases through the animation.
frequencies[0] = bin_idx
yield frame, frequencies
ani = animation.FuncAnimation(fig, animate, step, interval=10,
repeat=False, blit=False, fargs=(rects,))
plt.show()
</code></pre>
<hr/>
<p>如果没有更新版本的Matplotlib,这里有一个旧的方法。速度稍慢(~<strong>45帧每秒</strong>):</p>
<p>不要在循环的每次迭代中调用<code>plt.bar</code>。相反,只需调用一次,保存<code>rects</code>返回值,然后调用<code>set_height</code>在循环的后续迭代中修改这些{<cd3>}的高度。这个技巧(和其他技巧)在<a href="http://www.scipy.org/Cookbook/Matplotlib/Animations" rel="nofollow">Matplotlib Animations Cookbook</a>中解释。在</p>
^{pr2}$
<p>作为比较,在我的机器上,将<code>plt.clf</code>添加到原始代码中,大约达到每秒12帧</strong>。在</p>
<hr/>
<p>关于时间安排的一些评论:</p>
<p>通过计算每次通过循环的非常小的时间差,无法获得精确的测量结果。至少在我的电脑上,<code>time.time()</code>的时间分辨率不够好。通过测量一个开始时间并计算开始时间和当前时间之间的大时间差,然后除以帧数,可以得到更精确的测量结果。在</p>
<p>我还将<code>time.time</code>改为<code>timeit.default_timer</code>。在Unix计算机上这两者是相同的,但是在Windows计算机上,<code>timeit.default_timer</code>被设置为<code>time.clock</code>。因此,<code>timeit.default_timer</code>为每个平台选择更精确的计时器。在</p>