gpt4 book ai didi

python - 在 Python 中制作直方图动画

转载 作者:行者123 更新时间:2023-11-28 22:54:13 25 4
gpt4 key购买 nike

我正在尝试随着时间的推移为直方图制作动画,到目前为止我拥有的代码如下:

import matplotlib.pyplot as plt
import numpy as np
import time
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(111)

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)
for bin_idx in np.linspace(0,1000000,100000000):
t = time.time()
#Here we just change the first bin, so it increases through the animation.
frequencies[0] = bin_idx
line1 =plt.bar(pos, frequencies, width, color='r')
plt.draw()
elapsed = time.time() - t
print elapsed

代码有效,但输出显示经过一些迭代后它变得比开始时慢得多。有没有办法加快速度,我们想实时更新这个,它运行的过程非常快。

另外,请务必注意,我不想要后处理动画,我们想要实时更新,因此直方图动画示例不适用于此特定过程。

谢谢

最佳答案

如果您有较新版本的 Matplotlib,则会有一个 animations.FuncAnimation class这可以帮助减少一些样板代码。 (以 See this page 为例。)它非常快(~ 每秒 52 帧):

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

如果您没有较新版本的 Matplotlib,这里是较旧的方法。它稍慢(~ 每秒 45 帧):

不要在循环的每次迭代中调用 plt.bar。相反,只调用一次,保存 rects 返回值,然后调用 set_height 来修改那些 rects 的后续迭代的高度环形。 Matplotlib Animations Cookbook 中解释了这个技巧(和其他技巧) .

import sys
import matplotlib as mpl
mpl.use('TkAgg') # do this before importing pyplot
import matplotlib.pyplot as plt
import numpy as np
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)

def animate():
start = clock()
rects = plt.bar(pos, frequencies, width, color='r')
for frameno, bin_idx in enumerate(np.linspace(0,1000000,100000000), 2):
#Here we just change the first bin, so it increases through the animation.
frequencies[0] = bin_idx
# rects = plt.bar(pos, frequencies, width, color='r')
for rect, f in zip(rects, frequencies):
rect.set_height(f)
fig.canvas.draw()
print("FPS: {:.2f}".format(frameno / (clock() - start)))

win = fig.canvas.manager.window
win.after(1, animate)
plt.show()

为了比较,将 plt.clf 添加到您的原始代码中,在我的机器上达到了大约 每秒 12 帧


关于时间的一些评论:

通过计算每次通过循环的非常小的时间差,您将无法获得准确的测量结果。 time.time() 的时间分辨率——至少在我的电脑上——不够好。通过测量一个开始时间并计算开始时间和当前时间之间的较大时间差,然后除以帧数,您将获得更准确的测量结果。

我还将 time.time 更改为 timeit.default_timer。这两者在 Unix 计算机上是相同的,但 timeit.default_timer 在 Windows 计算机上设置为 time.clock。因此 timeit.default_timer 为每个平台选择更准确的计时器。

关于python - 在 Python 中制作直方图动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18320240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com