Я следую этому уроку Компоненты живого обновления от 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 ]