Matplotlib实时图 - 使用时间作为x轴值

时间:2018-04-27 09:25:25

标签: python python-3.x matplotlib tkinter

我只是想知道是否可以将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'

我已经尝试过将字符串转换为浮点数的方法,但我似乎无法做到这一点

我真的很感激一些帮助和指导,谢谢:)

2 个答案:

答案 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 packagepolt使用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
...

然后可以将此输出piped放入polt中以显示实时数据流:

python3 adc_read.py | polt live

polt plot window

可以通过添加元数据来实现标签:

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 plot window

polt documentation包含有关进一步定制的可能性的信息。