Matplotlib Live Graph - Использование времени в качестве значений оси X - PullRequest
0 голосов
/ 27 апреля 2018

Мне было просто интересно, можно ли использовать Time в качестве значений оси x для живого графа matplotlib. Если так, как это должно быть сделано? Я пробовал много разных методов, но в конечном итоге с ошибками. Это мой текущий код:

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 голосов
/ 25 апреля 2019

Вы можете использовать пакет Python , который я разработал для этой конкретной цели. polt использует matplotlib для одновременного отображения данных из нескольких источников.

Создайте скрипт adc_read.py, который считывает значения из вашего АЦП и 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
...

Этот вывод может быть затем передан по каналу в 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 содержит информацию о возможностях дальнейшей настройки.

0 голосов
/ 27 апреля 2018

Я думаю, что вы должны использовать библиотеку datetime. Вы можете прочитать свои даты, используя эту команду date=datetime.strptime('17:21:55','%H:%M:%S'), но вы должны использовать юлианскую дату в качестве справочной, установив date0=datetime(1970, 1, 1). Вы также можете использовать начальную точку своего временного ряда в качестве даты0, а затем установить свою дату как * 1003. *. Рассчитайте разницу между вашей фактической датой и контрольной датой IN SECONDS (для этого есть несколько функций) для каждой строки в вашем файле, используя цикл, и измените эту разницу на элемент списка (мы назовем этот список Diff_list). В конце используйте T_plot= [dtm.datetime.utcfromtimestamp(i) for i in Diff_List]. Наконец, plt.plot(T_plot,values) позволит вам визуализировать даты на оси X.

Вы также можете использовать библиотеку панд

сначала определите ваш разбор даты в зависимости от типа даты в вашем файле 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...