选择要绘制的列时在 Dash 中更新 scatter.children 的回调错误(键错误)
Callback error (Key error) updating scatter.children in Dash while selecting a column for plotting
我在 运行 Dash 应用程序(我的第一个应用程序)时收到消息“回调错误更新 scatter.children”。调试显示:KeyError 'Hours'。 'Hours 是我在数据框中的专栏。列名没问题,数据绘制正确,但错误消息始终存在。我不明白为什么我得到它。非常欢迎任何建议。
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objs as go
import pandas as pd
import numpy as np
app = dash.Dash()
df_percent = pd.read_csv('data/neo_percent.csv')
app.layout = html.Div([
html.H1('Graph picker dashboard'),
html.H3('select a patient'),
dcc.Dropdown(
id='patient-selector',
options=[
{'label': 'R1', 'value': 'R1'},
{'label': 'R2', 'value': 'R2'},
{'label': 'R3', 'value': 'R3'}
],
value='none',
placeholder='Patient',
style=dict(
width='40%',
horizontalAlign='right',
color='blue'
)
),
html.Div(id='output-patient-selector'),
html.Div(id='scatter')
],
)
@app.callback(
Output('output-patient-selector', 'children'),
[Input('patient-selector', 'value')])
def update_header(value):
return 'You have selected "{}"'.format(value)
# Adding first graph
@app.callback(
Output('scatter', 'children'),
[Input('patient-selector', 'value')])
def update_output(value):
patient = pd.DataFrame()
if value == 'R1':
patient = df_percent.iloc[0:6]
elif value == 'R2':
patient = df_percent.iloc[6:12]
elif value == 'R3':
patient = df_percent.iloc[12:18]
return dcc.Graph(id='scatter1',
figure={
'data': [
{
'x': patient['Hours'],
'y': patient['pct_Lymphs'],
'type': 'line',
'text':patient['Name'],
'hoverinfo': 'text + y + x'
}
],
'layout': go.Layout(title='Patient Data',
xaxis={'title': 'time'},
yaxis={'title': 'percent'},
hovermode='closest')
}
)
if __name__ == '__main__':
app.run_server(debug=True)
问题是初始回调触发。您的下拉值以 'none'
开头。回调中没有条件,因此 patient
的初始值仍然是:
patient = pd.DataFrame()
那个数据框中没有 'Hours'
,所以你得到了错误。更新下拉列表后,它可以满足您的条件之一来更新数据框,并且可以正常工作。这是解决该问题的一种方法:
if value == 'R1':
patient = df_percent.iloc[0:6]
elif value == 'R2':
patient = df_percent.iloc[6:12]
elif value == 'R3':
patient = df_percent.iloc[12:18]
else:
return dcc.Graph(id='scatter1', figure={})
我在 运行 Dash 应用程序(我的第一个应用程序)时收到消息“回调错误更新 scatter.children”。调试显示:KeyError 'Hours'。 'Hours 是我在数据框中的专栏。列名没问题,数据绘制正确,但错误消息始终存在。我不明白为什么我得到它。非常欢迎任何建议。
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objs as go
import pandas as pd
import numpy as np
app = dash.Dash()
df_percent = pd.read_csv('data/neo_percent.csv')
app.layout = html.Div([
html.H1('Graph picker dashboard'),
html.H3('select a patient'),
dcc.Dropdown(
id='patient-selector',
options=[
{'label': 'R1', 'value': 'R1'},
{'label': 'R2', 'value': 'R2'},
{'label': 'R3', 'value': 'R3'}
],
value='none',
placeholder='Patient',
style=dict(
width='40%',
horizontalAlign='right',
color='blue'
)
),
html.Div(id='output-patient-selector'),
html.Div(id='scatter')
],
)
@app.callback(
Output('output-patient-selector', 'children'),
[Input('patient-selector', 'value')])
def update_header(value):
return 'You have selected "{}"'.format(value)
# Adding first graph
@app.callback(
Output('scatter', 'children'),
[Input('patient-selector', 'value')])
def update_output(value):
patient = pd.DataFrame()
if value == 'R1':
patient = df_percent.iloc[0:6]
elif value == 'R2':
patient = df_percent.iloc[6:12]
elif value == 'R3':
patient = df_percent.iloc[12:18]
return dcc.Graph(id='scatter1',
figure={
'data': [
{
'x': patient['Hours'],
'y': patient['pct_Lymphs'],
'type': 'line',
'text':patient['Name'],
'hoverinfo': 'text + y + x'
}
],
'layout': go.Layout(title='Patient Data',
xaxis={'title': 'time'},
yaxis={'title': 'percent'},
hovermode='closest')
}
)
if __name__ == '__main__':
app.run_server(debug=True)
问题是初始回调触发。您的下拉值以 'none'
开头。回调中没有条件,因此 patient
的初始值仍然是:
patient = pd.DataFrame()
那个数据框中没有 'Hours'
,所以你得到了错误。更新下拉列表后,它可以满足您的条件之一来更新数据框,并且可以正常工作。这是解决该问题的一种方法:
if value == 'R1':
patient = df_percent.iloc[0:6]
elif value == 'R2':
patient = df_percent.iloc[6:12]
elif value == 'R3':
patient = df_percent.iloc[12:18]
else:
return dcc.Graph(id='scatter1', figure={})