使用Python和Matplotlib实时绘制传感器数据图

时间:2020-03-28 13:27:18

标签: python pandas matplotlib

我想使用matplotlib绘制图形。我正在检测来自传感器的数据,并将其放入excel文件中。但我无法获得所需的输出。

我在此处附加了sample code链接。

我还要附加修改后的代码。谁能在这件事上提供帮助

    import datetime as dt
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import xlrd

hsif = pd.read_excel('C:\\Users\\Hp\\Desktop\\Sensor.xlsx','Sheet2', skiprows=3)

data = hsif.columns.values[3]
print(data)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
xs = []
ys = []


# This function is called periodically from FuncAnimation
def animate(i, xs, ys):

    # Read data from sensor
    temp_c = data

    # Add x and y to lists
    xs.append(dt.datetime.now().strftime('%H:%M '))
    ys.append(temp_c) 

    # Limit x and y lists to 20 items
    xs = xs[-20:]
    ys = ys[-20:]

    # Draw x and y lists
    ax.clear()
    ax.plot(xs, ys)

    # Format plot
    plt.xticks(rotation=45, ha='right')
    plt.subplots_adjust(bottom=0.30)
    plt.title('Call OI over Time')
    plt.ylabel('Numbers')

# Set up plot to call animate() function periodically
ani = animation.FuncAnimation(fig, animate, fargs=(xs, ys), interval=1000)
plt.show()

1 个答案:

答案 0 :(得分:0)

我希望这个答案足够。 :S最后一个被删除的速度很快大声笑

因此我无法为您提供有关您的情况的代码,但我可以帮助您指出正确的方向。 通过执行以下操作,我能够每秒从传感器读数中获得实时图表

获取日期和时间

timeObj = time.localtime(Epoch)
thedate = '%d-%d-%d' % (timeObj.tm_mon, timeObj.tm_mday, timeObj.tm_year)
thetime = '%d:%d:%d' % (timeObj.tm_hour, timeObj.tm_min, timeObj.tm_sec)

您可以将日期和时间组合成一个字符串,但是我不在图表上使用日期。我希望将它们放在单独的列表中。然后,在动画函数中,每秒调用一次。您将要添加一个数据框。我用熊猫打开了一个csv(对不起,我没有打开excel的经验),打开时会自动创建一个数据框,如下所示:(dateparse使时间可由matplotlib读取)

dateparse = lambda x: pd.datetime.strptime(x, '$H:$M:$S')
def animate(e):
    headers = ['date', 'time', 'sensor']
    SonarDataF = pd.read_csv('livegraph.csv', parse_dates=True, date_parser=dateparse, names=headers, skiprows=1)

然后在接下来的动画行中调用一个函数来添加时间并读取数据框。

new_row = {'date': thedate, 'time': thetime, 'sensor': distance} 
SonarDataF = SonarDataF.append(new_row, ignore_index=True)

接下来的几行将检查您的数据,一旦到达20行,它就会删除每条记录的1行,这会基于动画每1000毫秒发生一次

num_rows = SonarDataF.shape[0]  # limits rows allowed in graph csv
if num_rows > 20:
    SonarDataF = SonarDataF.iloc[1:]

,现在您必须将通过animate函数提取的新数据读数保存到csv中(或excel,您必须查看如何执行此操作) 我保存到2个不同的文件。 1有20条线。 1是记录所有读数的日志。如果您想返回并检查以前的读数,则可以打开第二个文件并选择要绘制的内容

SonarDataF.to_csv('livegraph.csv', index=False)  # saves updated dataframe to be reloaded on next animate
lognumbers = {'date': thedate, 'time': thetime, 'sensor': sensor}  # saves new time and reading to full log
csv_file = "LogData.csv"
try:
    with open(csv_file, 'a') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=headers)
        for data in lognumbers:
            writer.writerow(lognumbers)
except IOError:
    print('fuck')
# get time, and convert it for matplotlib
tim3 = SonarDataF['time']
rTime = [datetime.strptime(t, '%H:%M:%S') for t in tim3]
rSensor = SonarDataF['sensor'].astype(float)
a.clear()
a.plot(rTime,rSensor)

如果您想查看我从这些示例中提取的代码,请参阅我的问题,其中包含一个从传感器获取数据的有效示例 pi4 GUI + matplotlib: Reading sensor, read/write csv, and updating matplotlib with static labels

相关问题