Error loading dependencies when using Dropdowns in Bar chart

Hi, I am trying to create an app the user can upload a file and choose which columns to plot in x-axis and y-axis of the bar chart. However, when I put dropdown as input value in the callback of the graph, I get Error loading dependencies. Any idea where I got it wrong?

Thanks a mil!

Below is my code:

import base64
import io
import dash
from dash.dependencies import Input, Output, State
import dash_core_components as dcc
import dash_html_components as html
import dash_table
import pandas as pd
import plotly.graph_objs as go
from dash.exceptions import PreventUpdate

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

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.config.suppress_callback_exceptions = True
app.layout = html.Div([     
        dcc.Upload(
        id='datatable-upload',
        children=html.Div([
            'Drag and Drop or ',
            html.A('Select Files')
        ]),
        style={
            'width': '100%', 'height': '60px', 'lineHeight': '60px',
            'borderWidth': '1px', 'borderStyle': 'dashed',
            'borderRadius': '5px', 'textAlign': 'center', 'margin': '10px'
        },
    ),
        html.Div(id='output-data-upload'),                       
        dcc.Dropdown(
        id='data_selector1',
        options=[       
            {'label': '', 'value': ''}
        ],
         value=[]
       ),
        dcc.Dropdown(
        id='data_selector2',
        options=[       
            {'label': '', 'value': ''}
        ],         
         value=[]
    ),
    dcc.Graph(id='datatable-upload-graph')              
])



def parse_contents(contents, filename):
    content_type, content_string = contents.split(',')
    decoded = base64.b64decode(content_string)
    if 'csv' in filename:
        # Assume that the user uploaded a CSV file
        return pd.read_csv(
            io.StringIO(decoded.decode('utf-8')))
    elif 'xls' in filename:
        # Assume that the user uploaded an excel file
        return pd.read_excel(io.BytesIO(decoded))
    
@app.callback(Output('output-data-upload', 'children'),
              [Input('datatable-upload', 'contents')],
              [State('datatable-upload', 'filename')])
def update_output(contents, filename):
    if contents is None:
        return []
    df = parse_contents(contents, filename)
    return html.Div([
        dash_table.DataTable(
            id='table',
            style_data={
                     'whiteSpace': 'normal',
                     'height': 'auto'
                     },
             style_table={'overflowX': 'scroll',
                          'maxHeight': '300',
                          'overflowY': 'scroll'},
             style_cell={                     
                     'minWidth': '150px', 'maxWidth': '180px',
                     'whiteSpace': 'normal',
                     'textAlign': 'left'
                },
            style_header={                   
                    'fontWeight': 'bold',                   
                                    },            
            fixed_rows={ 'headers': True, 'data': 0 },           
            columns=[{"name": i, "id": i, 'deletable': True, 'renamable': True} for i in df.columns],
            data=df.to_dict("records"),                             
            row_deletable=True,
            filter_action="native",
            sort_action="native",
            sort_mode='multi',
            editable=True,
        )
    ]) 
        
@app.callback(Output('data_selector1', 'options'),
              [Input('table', 'data')])
def update_dropdown(rows):
    if rows is None:
        raise PreventUpdate
    df = pd.DataFrame(rows)
    print('updating menus')
    columns=df.columns
    col_labels=[{'label' :k, 'value' :k} for k in columns]
    return col_labels

@app.callback(Output('data_selector2', 'options'),
              [Input('table', 'data')])
def update_dropdown2(rows):
    if rows is None:
        raise PreventUpdate
    df = pd.DataFrame(rows)
    print('updating menus')
    columns=df.columns
    col_labels=[{'label' :k, 'value' :k} for k in columns]
    return col_labels
        
@app.callback(Output('datatable-upload-graph', 'figure'),
              [Input('data_selector1', 'value'),  # I get the Error when i put this two input
              Input('data_selector2', 'value')],
              [State('table', 'data')])
def display_graph(value1, value2, rows):   
    df = pd.DataFrame(rows)
    trace1 = go.Bar(x=df[value1], y=df[value2], name='Active')
    return {
            'data': [trace1]
 }

if __name__ == '__main__':
    app.run_server(debug=True)

Using the latest version of Dash, I was able to get your code to work. The only thing I did was alter the id assoc. with the dcc.Graph so that the word datatable is not the first word. Not sure why Dash would care about this but changing it to the following prevents the error loading dependencies error:

dcc.Graph(id='xdatatable-upload-graph')

Hi, @flyingcujo thank you so much for the speedy reply. So, I try what you teach me, change the dcc. Graph Id to ‘xdatatable-upload-graph’ . But, I still get the error loading dependencies error after I change to the id of the graph callback. Since I won’t get this error if I change the id of dcc.Graph only. So, I think the cause of this error is in the callback of the graph. But I not sure why it will cause this error.