如何在matplotlib折线图中绘制来自txt文件的实时数据

How to plot data real time data from a txt file in a matplotlib line graph

我有一个超声波传感器,可以将距离写入 txt 文件,我想获取该数据并将其实时绘制在折线图上,但我找不到方法。

到目前为止我所做的是它会读取文件但它从不显示数据。

sensor.py

import RPi.GPIO as GPIO
import time


GPIO.setwarnings(False)
GPIO.cleanup()
GPIO.setmode(GPIO.BCM)

TRIG = 23
ECHO = 24

GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)

GPIO.output(TRIG, True)
GPIO.output(TRIG,False)

def get_distance():
    GPIO.output(TRIG, True)
    time.sleep(0.0001)
    GPIO.output(TRIG, False)
        
    while GPIO.input(ECHO) == False:
        start = time.time()
        
    while GPIO.input(ECHO) == True:
        end = time.time()
        
    sig_time = end - start

    distance = sig_time/0.000058
    
    print('Distance: {} cm'.format(round(distance)))
    return distance
    
while True:
    distance = get_distance()
    data = round(distance)
    
    output = open("front sensor distance.txt", "w")
    output.write(str(data))
    time.sleep(2)
    output.close()

每当我 运行 代码时,距离就会立即被删除,不会等待 time.sleep(2)

首先,确保超声波用于将数据写入文件的代码没有缓冲写入,并通过在每次写入后强制刷新来立即写入文件 output.flush(),我将您的代码编辑为这样做并将其更改为附加到文件而不是每次写入都删除所有旧数据我还让它保存 time 每次写入以在图中使用它。

start_time = time.time()

while True:
    output = open("front sensor distance.txt", "a")
    output.write(str(round(time.time()-start_time))+","+str(round(get_distance()))+"\n")
    time.sleep(2)
    output.flush()

然后您可以使用此代码示例,它每 1 秒从文件中读取数据并更新 real-time 中的图形。

我尽量把它写得尽可能接近你的描述,其中数据文件的每一行都包含 time,distance,用逗号分隔。

import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

def animate(i):
    file_data = open("front sensor distance.txt","r").read()
    dataArray = file_data.split('\n')
    time = []
    distance = []
    for eachLine in dataArray:
        if len(eachLine)>1:
            x,y = eachLine.split(',')
            time.append(float(x))
            distance.append(float(y))
    ax.clear()
    ax.plot(time,distance)

def Main():
    ani = animation.FuncAnimation(fig, animate, interval=1000)
    plt.show()
    print("done")

Main()

我没有你必须用来测试的硬件,所以我在我的机器上制作了 distance 函数 return 随机数来模拟你的体验。 和 运行 这两个文件将产生以下 real-time 图