Я пытаюсь визуализировать данные в Dash, используя среди прочего радарные карты. После того, как пользователь выбирает выбор из выпадающего меню, диаграмма обновляется соответствующим образом. Визуализация «почти идеальная», за исключением ошибки, генерируемой на каждом графике / выходе, с использованием раскрывающегося списка в качестве входных данных.
Как удалить / устранить следующие ошибки:
Callback error updating new_radar.figure
Callback error updating GDPR_score.children
Callback error updating tbc_radar.figure
Код следующий:
# -*- coding: utf-8 -*-
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objects as go
import pandas as pd
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
cols_to_use = []
for i in range(20):
cols_to_use.append(i)
df = pd.read_csv('https://raw.githubusercontent.com/lo1gr/GDPR/master/GDPR.csv', usecols=cols_to_use)
row_names = list(df.Policy)
gdpr_dim = list(df.loc[df['Policy'] == 'POLICY01'].iloc[:, 1:8])
# too long:
# tbc_law = list(df.loc[df['Policy'] == 'POLICY01'].iloc[:, 11:19])[::3]
tbc_law = ['TRANSPARENCY', 'BENEFITS', 'CONTROL']
gdpr_dim
# list out of a row:
noway = list(df.loc[df['Policy'] == 'POLICY01'].iloc[:, 1:8].iloc[0])
# numbers = [ int(x) for x in noway ]
noway
# list tbc
# list(df.loc[df['Policy'] == 'POLICY01'].iloc[:, 11:19].iloc[0])[::3]
# df.at[5,'OVERALL: I trust this company for handling my data']
def generate_table(dataframe, max_rows=10):
return html.Table(
# Header
[html.Tr([html.Th(col) for col in dataframe.columns])] +
# Body
[html.Tr([
html.Td(dataframe.iloc[i][col]) for col in dataframe.columns
]) for i in range(min(len(dataframe), max_rows))]
)
app.layout = html.Div(children=[
html.H1(children='GDPR visualization', style={'textAlign': 'center'}),
html.Div(children='''
Using data graciously labeled by our Data Science class <3.
'''),
dcc.Dropdown(
id='dropdown',
options=[
{'label': v, 'value': v} for v in row_names
],
value='Policy01',
placeholder='Policy01'
),
# dcc.Graph(
# id='new_radar',
# figure={
# 'data': [go.Scatterpolar(
# r=list(df.loc[df['Policy'] == 'POLICY01'].iloc[:, 1:8].iloc[0]),
# theta=gdpr_dim,
# fill='toself'
# )],
# 'layout': {
# 'title': 'Dash Data Visualization for Policy01'
# }
# }
# ),
# dcc.Graph(
# id='new_radar'
# ),
html.P(id='GDPR_score'),
# dcc.Graph(
# id='tbc_radar'
# ),
html.Div([
html.Div([
dcc.Graph(id='tbc_radar')
], className="six columns"),
html.Div([
dcc.Graph(id='new_radar')
], className="six columns"),
], className="row"),
generate_table(df)
])
@app.callback(
Output(component_id='new_radar', component_property='figure'),
[Input(component_id='dropdown', component_property='value')]
)
def update_output_div(input_value):
fig = [go.Scatterpolar(
r=[int(x) for x in list(df.loc[df['Policy'] == str(input_value)].iloc[:, 1:8].iloc[0])],
theta=gdpr_dim,
fill='toself'
)]
layout = {'title': 'GDPR viz for ' + input_value}
return {"data": fig, "layout": layout}
@app.callback(
Output(component_id='GDPR_score', component_property='children'),
[Input(component_id='dropdown', component_property='value')]
)
def update_output_div(input_value):
test = list(df.loc[df['Policy'] == str(input_value)].iloc[:, 1:8].iloc[0])
score = int(sum(test))
return score
@app.callback(
Output(component_id='tbc_radar', component_property='figure'),
[Input(component_id='dropdown', component_property='value')]
)
def update_output_div(input_value):
fig = [go.Scatterpolar(
r=[int(x) for x in list(df.loc[df['Policy'] == str(input_value)].iloc[:, 11:19].iloc[0])[::3]],
theta=tbc_law,
fill='toself'
)]
layout = {'title': 'TBC viz for ' + input_value}
return {"data": fig, "layout": layout}
app.css.append_css({
'external_url': 'https://codepen.io/chriddyp/pen/bWLwgP.css'
})
if __name__ == '__main__':
app.run_server(debug=True)
Кроме того, есть какие-либо комментарии к коду в целом? Что бы вы сделали лучше?
Спасибо!