I want to create a webapp that lets you upload a file then visualize it upon selecting the fields you want from the dropdown. The upload works and the dropdown gets update with the new columns name but the figure doesn’t show anything.
Here’s my code:
> import base64
> import datetime
> 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 plotly.graph_objs as go
>
> import pandas as pd
>
>
> 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='upload-data',
> 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'
> },
> # Allow multiple files to be uploaded
> multiple=True
> ),
> html.Div(id='output-data-upload'),
> ])
>
> def parse_contents(contents, filename, date):
> content_type, content_string = contents.split(',')
> decoded = base64.b64decode(content_string)
> try:
> if 'csv' in filename:
> # Assume that the user uploaded a CSV file
> df = pd.read_csv(
> io.StringIO(decoded.decode('utf-8')))
> elif 'xls' in filename:
> # Assume that the user uploaded an excel file
> df = pd.read_excel(io.BytesIO(decoded))
> except Exception as e:
> print(e)
> return html.Div([
> 'There was an error processing this file.'
> ])
>
> return html.Div([
> html.H5(filename),
> html.H6(datetime.datetime.fromtimestamp(date)),
>
> dash_table.DataTable(
> data=df.to_dict('rows'),
> columns=[{'name': i, 'id': i} for i in df.columns]
> ),
>
> html.Hr(), # horizontal line
>
> # For debugging, display the raw contents provided by the web browser
> html.Div('Raw Content'),
> html.Pre(contents[0:200] + '...', style={
> 'whiteSpace': 'pre-wrap',
> 'wordBreak': 'break-all'
> }),
> dcc.Dropdown(
> id='dropdown',
> options=[
> {'label':i, 'value': i} for i in df.columns
> ],
> value=df.columns[0]
>
>
> ),
> dcc.Dropdown(
> id='dropdown1',
> options=[
> {'label':i, 'value': i} for i in df.columns
> ],
> value=df.columns[1]
>
>
> ),
> dcc.Graph(id='main-plot'),
>
> ])
>
> @app.callback(
> Output('main-plot', 'figure'),
> [Input('dropdown','value'),
> Input('dropdown1','value')])
> def plotly_maker(col1,col2):
> '''
> Return a plotly figure
> '''
> data= []
>
> for val in range(3):
> trace = go.Scatter(
> x = df[df['carat']==val][col1],
> y = df[df['price']==val][col2],
> mode = 'markers'
>
> )
> data.append(trace)
> layout = go.Layout()
> return {'data': data, 'layout': layout}
>
>
>
> @app.callback(Output('output-data-upload', 'children'),
> [Input('upload-data', 'contents')],
> [State('upload-data', 'filename'),
> State('upload-data', 'last_modified')])
> def update_output(list_of_contents, list_of_names, list_of_dates):
> if list_of_contents is not None:
> children = [
> parse_contents(c, n, d) for c, n, d in
> zip(list_of_contents, list_of_names, list_of_dates)]
> return children
>
>
>
> if __name__ == '__main__':
> app.run_server(debug=True)
and the console shows