Я пытаюсь получить данные графика в реальном времени из регистратора данных через FTP с помощью FuncAnimation. мне удалось получить оперативный хвост с FTP-сервера, который обновит кадр данных, но я не могу обновить график
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from ftplib import FTP
from io import BytesIO
import datetime
import time
ip_value = "192.168.100.100"
freq_time = 10 #update every 10 sec
ftp = FTP(ip_value)
ftp.login()
ftp.cwd('/sdcard/HIOKI/LR8450/DATA/')
folder_list = ftp.nlst("-t")
folder_path = folder_list[0]
ftp.cwd('/sdcard/HIOKI/LR8450/DATA/'+folder_path+'/')
file_list = ftp.nlst("-t")
file_path = file_list[0]
file_name = '/sdcard/HIOKI/LR8450/DATA/'+folder_path+'/'+file_path
flo = BytesIO()
ftp.retrbinary('RETR ' + file_name, flo.write)
flo.seek(0)
file = flo
prev_size = ftp.size(file_name) #get file size for use in updating plot
data = pd.read_csv(file, skiprows=[0,1,2,3,4,5,6,7,8,9,10,11], engine="python", encoding='unicode_escape', index_col=False, names=('time','data1','data2','alarm'))
fig, ax1 = plt.subplots()
twin1 = ax1.twinx()
fig.subplots_adjust(right=0.75)
p1, = ax1.plot(data.time, data.data1, color='black')
p2, = twin1.plot(data.time, data.data2, color='blue')
ax1.set_ylim(0, 50)
twin1.set_ylim(-.1, .1)
prev_time = datetime.datetime.now()
def get_data():
global prev_time, prev_size, data
print('getting data...')
print(datetime.datetime.now())
prev_time = datetime.datetime.now() #update previous time
current_size = ftp.size(file_name) #get current file size
size = max(current_size - (current_size - prev_size), 0) #calculate the added bytes to the file
prev_size = current_size #update previous size
flo2 = BytesIO()
ftp.retrbinary('RETR ' + file_name, flo2.write, rest=size)
flo2.seek(0)
new_data = pd.read_csv(flo2, engine="python", encoding='unicode_escape', header=None, index_col=0) #read new data
new_data.insert(loc=0, column='foo', value=[0] * len(new_data)) #insert a temp new column in index 0
new_data.columns = data.columns[range(len(new_data.columns))] #rename columns to match the data df
data = pd.concat([data, new_data]) #appened data with the new data
print('data recieved')
print(data)
return data
def draw_frame(frame):
global data
if datetime.datetime.now() - prev_time > datetime.timedelta(seconds=freq_time):
data = get_data()
p1.set_data(data.time, data.data1)
p2.set_data(data.time, data.data1)
return p1, p2
print(datetime.datetime.now())
time.sleep(freq_time)
ani = FuncAnimation(fig, draw_frame, interval=500)
plt.show()
Подробнее здесь: https://stackoverflow.com/questions/784 ... matplotlib
Построение графиков в реальном времени с ftp-сервера с использованием matplotlib ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение