我只是想知道是否可以将Time用作matplotlib实时图的x轴值。 如果是这样,应该怎么做?我一直在尝试许多不同的方法但最终会出错。 这是我目前的代码:
update_label(label):
def getvoltage():
f=open("VoltageReadings.txt", "a+")
readings = [0]*100
maxsample = 100
counter = 0
while (counter < maxsample):
reading = adc.read_adc(0, gain=GAIN)
readings.append(reading)
counter += 1
avg = sum(readings)/100
voltage = (avg * 0.1259)/100
time = str(datetime.datetime.now().time())
f.write("%.2f," % (voltage) + time + "\r\n")
readings.clear()
label.config(text=str('Voltage: {0:.2f}'.format(voltage)))
label.after(1000, getvoltage)
getvoltage()
def animate(i):
pullData = open("VoltageReadings.txt","r").read()
dataList = pullData.split('\n')
xList=[]
yList=[]
for eachLine in dataList:
if len(eachLine) > 1:
y, x = eachLine.split(',')
xList.append(float(x)))
yList.append(float(y))
a.clear()
a.plot(xList,yList)
这是我尝试过的最新方法之一,我收到的错误是
ValueError: could not convert string to float: '17:21:55'
我已经尝试过将字符串转换为浮点数的方法,但我似乎无法做到这一点
我真的很感激一些帮助和指导,谢谢:)
答案 0 :(得分:0)
我认为您应该使用日期时间库。您可以使用此命令date=datetime.strptime('17:21:55','%H:%M:%S')
阅读日期,但您必须通过设置date0=datetime(1970, 1, 1)
将朱利安日期作为参考。您还可以使用时间序列的起点作为日期0,然后设置日期为date=datetime.strptime('01-01-2000 17:21:55','%d-%m-%Y %H%H:%M:%S')
。使用循环计算文件中每一行的实际日期和参考日期IN SECONDS(有几个函数可以做到这一点)之间的差异,并将这种差异影响到一个列表元素(我们将此列表称为Diff_list)。最后使用T_plot= [dtm.datetime.utcfromtimestamp(i) for i in Diff_List]
。最后,plt.plot(T_plot,values)
将允许您在x轴上可视化日期。
您也可以使用pandas库
首先,根据文件parser=pd.datetime.strptime(date, '%Y-%m-%d %H:%M:%S')
然后你读了你的文件
tmp = pd.read_csv(your_file, parse_dates={'datetime': ['date', 'time']}, date_parser=parser, comment='#',delim_whitespace=True,names=['date', 'time', 'Values'])
data = tmp.set_index(tmp['datetime']).drop('datetime', axis=1)
如果您只需要表示HH:MM:SS
小时而不是整个日期,则可以调整这些行。
N.B:索引不会从0到data.values.shape[0]
,但日期将用作索引。因此,如果您想绘图,可以执行import matplotlib.pyplot as plt
然后plt.plot(data.index,data.Values)
答案 1 :(得分:0)
您可以使用我为此目的而开发的polt Python package。 polt使用matplotlib来模拟地显示多个来源的数据。
创建一个脚本adc_read.py
,该脚本从您的ADC读取值并print
将其输出:
import random, sys, time
def read_adc():
"""
Implement reading a voltage from your ADC here
"""
# simulate measurement delay/sampling interval
time.sleep(0.001)
# simulate reading a voltage between 0 and 5V
return random.uniform(0, 5)
while True:
# gather 100 readings
adc_readings = tuple(read_adc() for i in range(100))
# calculate average
adc_average = sum(adc_readings) / len(adc_readings)
# output average
print(adc_average)
sys.stdout.flush()
输出
python3 adc_read.py
# output
2.3187490696344444
2.40019412977279
2.3702603804716555
2.3793495215651435
2.5596985467604703
2.5433401603774413
2.6048815735614004
2.350392397280291
2.4372325168231948
2.5618046803145647
...
python3 adc_read.py | polt live
可以通过添加元数据来实现标签:
python3 adc_read.py | \
polt \
add-source -c- -o name=ADC \
add-filter -f metadata -o set-quantity=voltage -o set-unit='V' \
live
polt documentation包含有关进一步定制的可能性的信息。