选择要绘制的列时在 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={})