Python с использованием Matplotlib для построения графиков в реальном времени - PullRequest
1 голос
/ 10 января 2020

enter image description here Я предваляю это, говоря, что я все еще учу Python, поэтому, пожалуйста, будьте добры и терпеливы. Мой код выглядит следующим образом:

  • Клиент в сети отправляет текстовый файл (stats.txt) каждые ~ 5 секунд на сервер SCP. Python код находится на сервере.

Код ниже начинается:

import matplotlib.pyplot as plt
import csv
import datetime


x = []
y = []
rssi_val = []



def animate(i):
    with open('stats.txt', 'r') as searchfile:
        time = (searchfile.read(5))
        for line in searchfile:
            if 'agrCtlRSSI:' in line:
                rssi_val = line[16:20]

    y = [rssi_val]

    x = [time for i in range(len(y))]

    plt.xlabel('Time')
    plt.ylabel('RSSI')
    plt.title('Real time signal strength seen by client X')
    #plt.legend()


    plt.plot(x,y)

    ani = FuncAnimation(plt.gcf(), animate, interval=5000)

    plt.tight_layout()

    #plt.gcf().autofmt_xdate()

    plt.show()
  • Сервер SCP открывает файл каждые 5 секунд и выводит значения, которые анализируются с файл. Время отображается на оси X, а значение RSSI отображается на оси Y.

Я понимаю, что используемый код и методы на данный момент неэффективны и будут изменены в будущем. Сейчас я просто хочу, чтобы значения графика отображались, а график анимировался графиком (линией) каждые 5 или около того секунд.

Запуск его ничего не дает.

1 Ответ

1 голос
/ 10 января 2020

Вам нужна строка

ani = FuncAnimation(plt.gcf(), animate, interval=5000)

За пределами функции animate, при условии, что данные получены и прочитаны правильно, вы должны увидеть обновление графика. Вам также может понадобиться поставить plt.show() после строки FuncAnimation() в зависимости от того, как вы выполняете скрипт.


Edit

Возможно, вы захотите попробовать что-то подобное вместо этого

import matplotlib.pyplot as plt
import csv
import datetime

x = []
y = []
rssi_val = []

def animate(i):
    with open('stats.txt', 'r') as searchfile:
        time = (searchfile.read(5))
        for line in searchfile:
            if 'agrCtlRSSI:' in line:
                rssi_val = line[16:20]

    y.append(rssi_val)
    x.append(time)

    plt.cla()
    plt.plot(x,y)
    plt.xlabel('Time')
    plt.ylabel('RSSI')
    plt.title('Real time signal strength seen by client X')
    plt.tight_layout()

ani = FuncAnimation(plt.gcf(), animate, interval=5000)
plt.show()
...