我想使用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()
答案 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