【发布时间】:2017-05-04 08:07:51
【问题描述】:
我正在制作一个实时绘图仪来显示来自 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 分钟。 IE。用新值更新图表需要 1 分钟。我也尝试过使用 PyQtGraph,但这从一开始就被延迟了。
除了超过 20 分钟的延迟之外,我在情节中遇到了一些过冲和下冲。
有什么帮助吗?
【问题讨论】:
-
我认为问题在于 xar 和 yar 变量在一段时间后变得巨大。您可以尝试使用列表推导并改为执行列表的动态读取。
-
20 分钟后,您最好停止绘图,因为超过 1000 万个连接点的绘图将变得完全不可读。
-
@Jalo 谢谢。我看到变量太大了。问题是我需要再次重新绘制所有值,因为我每次都在清除绘图以免使其内存过载。我会降低采样频率:-)
-
您尝试管理的数据太多,无法在每次迭代时动态绘制所有历史数据。对于更简单的方法,我会将每次迭代时接收到的数据存储在一个文件中以供进一步分析,同时仅绘制最后 N 次迭代。
标签: python matplotlib arduino pyserial pyqtgraph