我正在制作一个实时绘图仪,以显示Arduino传感器的模拟变化。Arduino将波特率为9600的值打印到串行中。Python代码如下所示:
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import serial
import time
ser = serial.Serial("com3", 9600)
ser.readline()
optimal_frequency = 100
fig = plt.figure(figsize=(6, 6))
ax1 = fig.add_subplot(1, 1, 1)
# the following arrays must be initialized outside the loop
xar = []
yar = []
print(time.ctime())
def animate(i):
global b, xar, yar # otherwise a
for i in range(optimal_frequency):
a = str(ser.readline(), 'utf-8')
try:
b = float(a)
except ValueError:
ser.readline()
xar.append(str(time.time()))
yar.append(b)
ax1.clear()
ax1.plot(xar, yar)
ani = animation.FuncAnimation(fig, animate, interval=optimal_frequency)
plt.show()
在该图中可以得到良好的响应时间,但是当我绘制20分钟以上时,反应时间会增加到大约1分钟。也就是说,图形需要1分钟才能使用新值进行更新。我也尝试过使用PyQtGraph,但这从一开始就被延迟了。
除了延迟超过20分钟以外,我在图中还出现了一些过冲和下冲的情况。
有什么帮助吗?
如评论中所述,您做错了两件事:
ax.plot()
在每次迭代中创建一个新轴。您要执行的操作是:
在初始化函数中,创建一个空的Line2D对象
def init():
line, = ax.plot([], [], lw=2)
return line,
然后在更新功能(animate()
)中,line.set_data()
用于更新点的坐标。但是,为了保持性能,您必须将阵列的大小保持在合理的大小,因此,随着新数据的传入,您将必须删除旧数据。
def animate(i):
(...)
xar.append(str(time.time()))
yar.append(b)
line.set_data(xar, yar)
return line,
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句