(Dash Plotly) Обновление компонентов в режиме реального времени с информацией из сокета [update_graph_live не работает] - PullRequest
0 голосов
/ 29 марта 2019

Я следую этому уроку Компоненты живого обновления от dash.plot.ly;запуск его на ноутбуке Jupyter в Windows 10, python 2.7 с app.run_server(debug=False).У меня есть поток данных от датчика (для локализации), который сбрасывает на локальный хост: 800 сокет .Существуют две функции app.callback.update_metrics работает, а update_graph_live - нет.

Я получаю данные из своего сокета с помощью функции get_xyz ():

HOST = 'localhost'
PORT = 800
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
def listen_one_line():
    s.listen(1)
    conn, addr = s.accept()
    data = "".join(iter(lambda:conn.recv(1),"\n"))       
    conn.close()
    return data
def get_xyz():
    reader = csv.reader(listen_one_line().split('\n'), delimiter=';')
    current={}
    for row in reader:
        current['date']=row[0]
        current['time']=row[1]
        current['milliseconds']=row[2]
        current['tag_address']=row[3]
        current['x_coor']=row[4]
        current['y_coor']=row[5]
        current['z_coor']=row[6]
        #For debugging
        print "get_xyz is returning : "+str(current['x_coor'])+', '+str(current['y_coor'])+', '+str(current['z_coor'])
    return float(row[4]),float(row[5]),float(row[6])         

Аналогично учебнику и с использованием моей функции:

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.layout = html.Div(
    html.Div([
        html.H4('Title'),
        html.Div(id='live-update-text'),
        dcc.Graph(id='live-update-graph'),
        dcc.Interval(
            id='interval-component',
            interval=5*1000, # in milliseconds
            n_intervals=0
        )
    ])
)


@app.callback(Output('live-update-text', 'children'),
              [Input('interval-component', 'n_intervals')])
def update_metrics(n):
    x_coor, y_coor, z_coor = get_xyz() #This is working
    style = {'padding': '5px', 'fontSize': '16px'}
    return [
        html.Span('x: {0:.2f}'.format(x_coor), style=style),
        html.Span('y: {0:.2f}'.format(y_coor), style=style),
        html.Span('z: {0:.2f}'.format(z_coor), style=style)
    ]


# Multiple components can update everytime interval gets fired.
@app.callback(Output('live-update-graph', 'figure'),
              [Input('interval-component', 'n_intervals')])
def update_graph_live(n):
    data = {
        'time': [],
        'y_coor': [],
        'x_coor': [],
        'z_coor': []
    }

    # Collect some data
    for i in range(180):
        time = datetime.datetime.now() - datetime.timedelta(seconds=i*20)
        x_coor, y_coor, z_coor = get_xyz() #This is not working
        data['x_coor'].append(x_coor)
        data['y_coor'].append(y_coor)
        data['z_coor'].append(z_coor)
        data['time'].append(time)

    # Create the graph with subplots
    fig = plotly.tools.make_subplots(rows=3, cols=1, vertical_spacing=0.2)
    fig['layout']['margin'] = {
        'l': 70, 'r': 10, 'b': 30, 't': 10
    }
    fig['layout']['legend'] = {'x': 0, 'y': 1, 'xanchor': 'left'}

    fig.append_trace({
        'x': data['time'],
        'y': data['x_coor'],
        'name': 'x_coor',
        'mode': 'lines+markers',
        'type': 'scatter'
    }, 1, 1)
    fig.append_trace({
        'x': data['time'],
        'y': data['y_coor'],
        'name': 'y_coor',
        'mode': 'lines+markers',
        'type': 'scatter'
    }, 2, 1)
    fig.append_trace({
        'x': data['time'],
        'y': data['z_coor'],
        'name': 'z_coor',
        'mode': 'lines+markers',
        'type': 'scatter'
    }, 3, 1)

    return fig


if __name__ == '__main__':
    app.run_server(debug=False)
  • Dash не может отобразить 3 графика, когда я использую функцию get_xyz () в update_graph_live.Он отображает только 1 график plot.ly и остается пустым. Как это исправить? Пока update_metrics работает отлично.Мой анализ данных в этом отношении корректен.
  • Он работает, хотя с кодом Satellite в учебнике.
  • Некоторые stdout и stderr в ноутбуке, после запускаСервер Dash:
    127.0.0.1 - - [29/Mar/2019 09:57:30] "POST /_dash-update-component HTTP/1.1" 200 -
    get_xyz is returning : 38.27, 16.91, 1.20
    
  • Я не получаю вывод ниже ... Я стремлюсь отображать данные xyz в режиме реального времени, используя Dash.
    This is the format of your plot grid:
    [ (1,1) x1,y1 ]
    [ (2,1) x2,y2 ]
    [ (3,1) x3,y3 ]
    
...