matplotlib Pyplot实时更新条形图

nle07wnf  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(93)

我将从Arduino真实的收集数据,并尝试找到一种方法,在数据进入时在pyplot条形图上显示数据的更新。下面的示例代码是我希望实现的简化版本,但FuncAnimation方法太慢,或者至少是,我没有正确地使用它。我真的希望一次更新所有500个点,而不是每毫秒一次更新一个点,因为在实际应用中,一组新的数据将以每10毫秒一次的速度进入。
如果有人能指出如何更好地利用动画(或提出一个完全不同的方法),我将非常感谢。提前感谢。

import numpy as np
from matplotlib import animation as animation, pyplot as plt, cm

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

fig = plt.figure()

x = np.linspace(1,500,num=500)
counts = np.random.randint(0, 100, size=500)
bars = plt.bar(x, counts, facecolor='green', width=1)

def animate(frame):
   global bars
   counts = np.random.randint(0, 100, size=500)
   for i in range(len(counts)):
        bars[frame].set_height(counts[i])

ani = animation.FuncAnimation(fig, animate, frames=len(x), interval = 1)

plt.xlabel("Time (ms)")
plt.ylabel("Counts")
plt.title("Window Counts")
plt.ylim([0,100])
plt.xlim([0,500])
plt.show()
ippsafx7

ippsafx71#

在chrslg的帮助下,我能够让这个完全按照我想要的方式工作。事实上,bars[].set_height调用是使用FuncAnimation中的“frame”作为索引的。我真正想要的是使用我的for循环中的索引作为bars[].set_height的索引,并将FuncAnimation中的frames设置为1。这样,整个图表将每毫秒用新的随机值更新一次。这正是我想要的

import numpy as np
from matplotlib import animation as animation, pyplot as plt, cm

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

fig = plt.figure()

x = np.linspace(1,500,num=500)
counts = np.random.randint(0, 100, size=500)
bars = plt.bar(x, counts, facecolor='green', width=1)

def animate(frame):
   global bars
   counts = np.random.randint(0, 100, size=500)
   for index, value in enumerate(counts):
        bars[index].set_height(value)

ani = animation.FuncAnimation(fig, animate, frames=1, interval = 1)

plt.xlabel("Time (ms)")
plt.ylabel("Counts")
plt.title("Window Counts")
plt.ylim([0,100])
plt.xlim([0,500])
plt.show()

相关问题