Plotly Dash table 回调
Plotly Dash table callback
我试图让滑块、用户输入和 table 之间的依赖关系起作用。我试过输出数据并使用回调来更新它。我被建议只在回调中创建 table 并只使用 "Div." 来定义它在显示中的位置。
其他信息:
- table 是使用 dash_table 库从 pandas DataFrame 创建的。
- 数据为字典格式。
- 变量
threshold
是用户输入(滑块或输入)调整的值
如果有人能帮我找出为什么 table 没有显示,我将不胜感激?
这是我的代码:
import dash
import dash_bootstrap_components as dbc
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
from dash.dependencies import Input, Output
import dash_table
threshold = 0.5
################################################################
###################### Table Data ##############################
################################################################
metrics_index = ["AUC", "Accuracy", "Kappa", "Sensitivity (Recall)", "Specificity", "Precision", "F1"]
algo_columns = ["Test-SVM+Naïve B", "RF"]
table_data = {"AUC": [threshold * 0.8, threshold * 0.83],
"Accuracy": [threshold * 0.85, threshold * 0.86],
"Kappa": [threshold * 0.66, threshold * 0.69],
"Sensitivity (Recall)": [threshold * 0.82, threshold * 0.83],
"Specificity": [threshold * 0.78, threshold * 0.79],
"Precision": [threshold * 0.78, threshold * 0.79],
"F1": [threshold * 0.81, threshold * 0.82]}
data = [i for i in table_data]
table = pd.DataFrame(columns=algo_columns, index=metrics_index, data=[table_data[i] for i in metrics_index])
# display(table)
################################################################
######################## Body ################################
################################################################
body = dbc.Container(
[
dbc.Row(
[
dbc.Col(
[
html.H2("Slider + Manual entry test"),
dcc.Slider(
id='my-slider',
min=0,
max=1,
step=0.01,
marks={"0": "0", "0.5": "0.5", "1": "1"},
value=threshold
),
html.Div(id='update-table')
]
),
dbc.Col(
[
html.Div(
[
html.Div(
dcc.Input(id='input-box', type='float', max=0, min=1, step=0.01, value=threshold)
),
html.Div(id='slider-output-container')
]
)
]
)
]
)
]
)
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
app.layout = html.Div([body])
##############################################################
######################## callbacks ###########################
##############################################################
@app.callback(
dash.dependencies.Output('slider-output-container', 'children'),
[dash.dependencies.Input('my-slider', 'value')]
)
def update_output(value):
threshold = float(value)
return threshold
# call back for slider to update based on manual input
@app.callback(
dash.dependencies.Output(component_id='my-slider', component_property='value'),
[dash.dependencies.Input('input-box', 'value')]
)
def update_output(value):
threshold = float(value)
return threshold
# call back to update table
@app.callback(
dash.dependencies.Output('update-table', 'children'),
[dash.dependencies.Input('my-slider', 'value')]
)
def update_output(value):
threshold = float(value)
table_data = {"AUC": [threshold * 0.8, threshold * 0.83],
"Accuracy": [threshold * 0.85, threshold * 0.86],
"Kappa": [threshold * 0.66, threshold * 0.69],
"Sensitivity (Recall)": [threshold * 0.82, threshold * 0.83],
"Specificity": [threshold * 0.78, threshold * 0.79],
"Precision": [threshold * 0.78, threshold * 0.79],
"F1": [threshold * 0.81, threshold * 0.82]}
return dash_table.DataTable(
id='update-table',
data= table_data.to_dict('records'),
columns=[{'id': x, 'name': x} for x in table.columns]
)
if __name__ == "__main__":
app.run_server()
[screenshot of table live dynamic editing]
import dash
import dash_bootstrap_components as dbc
import dash_core_components as dcc
import dash_html_components as html
import dash_table
import pandas as pd
from dash.dependencies import Input, Output
threshold = 0.5
################################################################
###################### Table Data ##############################
################################################################
metrics_index = [
"AUC",
"Accuracy",
"Kappa",
"Sensitivity (Recall)",
"Specificity",
"Precision",
"F1",
]
algo_columns = ["Test-SVM+Naïve B", "RF"]
table_data = {
"AUC": [threshold * 0.8, threshold * 0.83],
"Accuracy": [threshold * 0.85, threshold * 0.86],
"Kappa": [threshold * 0.66, threshold * 0.69],
"Sensitivity (Recall)": [threshold * 0.82, threshold * 0.83],
"Specificity": [threshold * 0.78, threshold * 0.79],
"Precision": [threshold * 0.78, threshold * 0.79],
"F1": [threshold * 0.81, threshold * 0.82],
}
data = [i for i in table_data]
table = pd.DataFrame(
columns=algo_columns,
index=metrics_index,
data=[table_data[i] for i in metrics_index],
)
# display(table)
################################################################
######################## Body ################################
################################################################
body = dbc.Container(
[
dbc.Row(
[
dbc.Col(
[
html.H2("Slider + Manual entry test"),
dcc.Slider(
id="my-slider",
min=0,
max=1,
step=0.01,
marks={"0": "0", "0.5": "0.5", "1": "1"},
value=threshold,
),
html.Div(id="update-table"),
]
),
dbc.Col(
[
html.Div(
[
html.Div(
dcc.Input(
id="input-box",
max=0,
min=1,
step=0.01,
value=threshold,
)
),
html.Div(id="slider-output-container"),
]
)
]
),
]
)
]
)
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
app.layout = html.Div([body])
##############################################################
######################## callbacks ###########################
##############################################################
@app.callback(
dash.dependencies.Output("slider-output-container", "children"),
[dash.dependencies.Input("my-slider", "value")],
)
def update_output(value):
threshold = float(value)
return threshold
# call back for slider to update based on manual input
@app.callback(
dash.dependencies.Output(component_id="my-slider", component_property="value"),
[dash.dependencies.Input("input-box", "value")],
)
def update_output(value):
threshold = float(value)
return threshold
# call back to update table
@app.callback(
dash.dependencies.Output("update-table", "children"),
[dash.dependencies.Input("my-slider", "value")],
)
def update_output(value):
threshold = float(value)
table_data = pd.DataFrame.from_dict(
{
"AUC": [threshold * 0.8, threshold * 0.83],
"Accuracy": [threshold * 0.85, threshold * 0.86],
"Kappa": [threshold * 0.66, threshold * 0.69],
"Sensitivity (Recall)": [threshold * 0.82, threshold * 0.83],
"Specificity": [threshold * 0.78, threshold * 0.79],
"Precision": [threshold * 0.78, threshold * 0.79],
"F1": [threshold * 0.81, threshold * 0.82],
}
)
return html.Div(
[
dash_table.DataTable(
data=table_data.to_dict("rows"),
columns=[{"id": x, "name": x} for x in table_data.columns],
)
]
)
if __name__ == "__main__":
app.run_server(host="0.0.0.0", port=8050, debug=True, dev_tools_hot_reload=True)
我试过了,上面的代码稍作修改后似乎可以正常工作;我必须做出的改变是:
- 将 dict
table_data
转换为数据帧(这允许 .to_dict()
方法,这是一种 pd.DataFrame 方法!)
table_data = pd.DataFrame.from_dict(
{
"AUC": [threshold * 0.8, threshold * 0.83],
"Accuracy": [threshold * 0.85, threshold * 0.86],
"Kappa": [threshold * 0.66, threshold * 0.69],
"Sensitivity (Recall)": [threshold * 0.82, threshold * 0.83],
"Specificity": [threshold * 0.78, threshold * 0.79],
"Precision": [threshold * 0.78, threshold * 0.79],
"F1": [threshold * 0.81, threshold * 0.82],
}
)
也在 update_output
回调 fxn 中:
- 一个。将 df 的 'records' 更改为 'rows'。to_dict 方法调用
- 乙。你有 table 而不是 table_data 用于列 param
- C。在此处删除
id
Dash 参数的使用,b/c 它已经在布局中
return html.Div(
[
dash_table.DataTable(
data=table_data.to_dict("rows"),
columns=[{"id": x, "name": x} for x in table_data.columns],
)
]
)
- 看起来你调换了最大值和最小值! (最大零不会留下很多可能的输入![实际上,none..]);放置小数点和匹配精度也可能很重要,我添加以防万一。
html.Div(
dcc.Input(
id="input-box",
max=1.00,
min=0.00,
step=0.01,
value=threshold,
type="number"
)
),
我试图让滑块、用户输入和 table 之间的依赖关系起作用。我试过输出数据并使用回调来更新它。我被建议只在回调中创建 table 并只使用 "Div." 来定义它在显示中的位置。
其他信息:
- table 是使用 dash_table 库从 pandas DataFrame 创建的。
- 数据为字典格式。
- 变量
threshold
是用户输入(滑块或输入)调整的值
如果有人能帮我找出为什么 table 没有显示,我将不胜感激?
这是我的代码:
import dash
import dash_bootstrap_components as dbc
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
from dash.dependencies import Input, Output
import dash_table
threshold = 0.5
################################################################
###################### Table Data ##############################
################################################################
metrics_index = ["AUC", "Accuracy", "Kappa", "Sensitivity (Recall)", "Specificity", "Precision", "F1"]
algo_columns = ["Test-SVM+Naïve B", "RF"]
table_data = {"AUC": [threshold * 0.8, threshold * 0.83],
"Accuracy": [threshold * 0.85, threshold * 0.86],
"Kappa": [threshold * 0.66, threshold * 0.69],
"Sensitivity (Recall)": [threshold * 0.82, threshold * 0.83],
"Specificity": [threshold * 0.78, threshold * 0.79],
"Precision": [threshold * 0.78, threshold * 0.79],
"F1": [threshold * 0.81, threshold * 0.82]}
data = [i for i in table_data]
table = pd.DataFrame(columns=algo_columns, index=metrics_index, data=[table_data[i] for i in metrics_index])
# display(table)
################################################################
######################## Body ################################
################################################################
body = dbc.Container(
[
dbc.Row(
[
dbc.Col(
[
html.H2("Slider + Manual entry test"),
dcc.Slider(
id='my-slider',
min=0,
max=1,
step=0.01,
marks={"0": "0", "0.5": "0.5", "1": "1"},
value=threshold
),
html.Div(id='update-table')
]
),
dbc.Col(
[
html.Div(
[
html.Div(
dcc.Input(id='input-box', type='float', max=0, min=1, step=0.01, value=threshold)
),
html.Div(id='slider-output-container')
]
)
]
)
]
)
]
)
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
app.layout = html.Div([body])
##############################################################
######################## callbacks ###########################
##############################################################
@app.callback(
dash.dependencies.Output('slider-output-container', 'children'),
[dash.dependencies.Input('my-slider', 'value')]
)
def update_output(value):
threshold = float(value)
return threshold
# call back for slider to update based on manual input
@app.callback(
dash.dependencies.Output(component_id='my-slider', component_property='value'),
[dash.dependencies.Input('input-box', 'value')]
)
def update_output(value):
threshold = float(value)
return threshold
# call back to update table
@app.callback(
dash.dependencies.Output('update-table', 'children'),
[dash.dependencies.Input('my-slider', 'value')]
)
def update_output(value):
threshold = float(value)
table_data = {"AUC": [threshold * 0.8, threshold * 0.83],
"Accuracy": [threshold * 0.85, threshold * 0.86],
"Kappa": [threshold * 0.66, threshold * 0.69],
"Sensitivity (Recall)": [threshold * 0.82, threshold * 0.83],
"Specificity": [threshold * 0.78, threshold * 0.79],
"Precision": [threshold * 0.78, threshold * 0.79],
"F1": [threshold * 0.81, threshold * 0.82]}
return dash_table.DataTable(
id='update-table',
data= table_data.to_dict('records'),
columns=[{'id': x, 'name': x} for x in table.columns]
)
if __name__ == "__main__":
app.run_server()
[screenshot of table live dynamic editing]
import dash
import dash_bootstrap_components as dbc
import dash_core_components as dcc
import dash_html_components as html
import dash_table
import pandas as pd
from dash.dependencies import Input, Output
threshold = 0.5
################################################################
###################### Table Data ##############################
################################################################
metrics_index = [
"AUC",
"Accuracy",
"Kappa",
"Sensitivity (Recall)",
"Specificity",
"Precision",
"F1",
]
algo_columns = ["Test-SVM+Naïve B", "RF"]
table_data = {
"AUC": [threshold * 0.8, threshold * 0.83],
"Accuracy": [threshold * 0.85, threshold * 0.86],
"Kappa": [threshold * 0.66, threshold * 0.69],
"Sensitivity (Recall)": [threshold * 0.82, threshold * 0.83],
"Specificity": [threshold * 0.78, threshold * 0.79],
"Precision": [threshold * 0.78, threshold * 0.79],
"F1": [threshold * 0.81, threshold * 0.82],
}
data = [i for i in table_data]
table = pd.DataFrame(
columns=algo_columns,
index=metrics_index,
data=[table_data[i] for i in metrics_index],
)
# display(table)
################################################################
######################## Body ################################
################################################################
body = dbc.Container(
[
dbc.Row(
[
dbc.Col(
[
html.H2("Slider + Manual entry test"),
dcc.Slider(
id="my-slider",
min=0,
max=1,
step=0.01,
marks={"0": "0", "0.5": "0.5", "1": "1"},
value=threshold,
),
html.Div(id="update-table"),
]
),
dbc.Col(
[
html.Div(
[
html.Div(
dcc.Input(
id="input-box",
max=0,
min=1,
step=0.01,
value=threshold,
)
),
html.Div(id="slider-output-container"),
]
)
]
),
]
)
]
)
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
app.layout = html.Div([body])
##############################################################
######################## callbacks ###########################
##############################################################
@app.callback(
dash.dependencies.Output("slider-output-container", "children"),
[dash.dependencies.Input("my-slider", "value")],
)
def update_output(value):
threshold = float(value)
return threshold
# call back for slider to update based on manual input
@app.callback(
dash.dependencies.Output(component_id="my-slider", component_property="value"),
[dash.dependencies.Input("input-box", "value")],
)
def update_output(value):
threshold = float(value)
return threshold
# call back to update table
@app.callback(
dash.dependencies.Output("update-table", "children"),
[dash.dependencies.Input("my-slider", "value")],
)
def update_output(value):
threshold = float(value)
table_data = pd.DataFrame.from_dict(
{
"AUC": [threshold * 0.8, threshold * 0.83],
"Accuracy": [threshold * 0.85, threshold * 0.86],
"Kappa": [threshold * 0.66, threshold * 0.69],
"Sensitivity (Recall)": [threshold * 0.82, threshold * 0.83],
"Specificity": [threshold * 0.78, threshold * 0.79],
"Precision": [threshold * 0.78, threshold * 0.79],
"F1": [threshold * 0.81, threshold * 0.82],
}
)
return html.Div(
[
dash_table.DataTable(
data=table_data.to_dict("rows"),
columns=[{"id": x, "name": x} for x in table_data.columns],
)
]
)
if __name__ == "__main__":
app.run_server(host="0.0.0.0", port=8050, debug=True, dev_tools_hot_reload=True)
我试过了,上面的代码稍作修改后似乎可以正常工作;我必须做出的改变是:
- 将 dict
table_data
转换为数据帧(这允许.to_dict()
方法,这是一种 pd.DataFrame 方法!)
table_data = pd.DataFrame.from_dict(
{
"AUC": [threshold * 0.8, threshold * 0.83],
"Accuracy": [threshold * 0.85, threshold * 0.86],
"Kappa": [threshold * 0.66, threshold * 0.69],
"Sensitivity (Recall)": [threshold * 0.82, threshold * 0.83],
"Specificity": [threshold * 0.78, threshold * 0.79],
"Precision": [threshold * 0.78, threshold * 0.79],
"F1": [threshold * 0.81, threshold * 0.82],
}
)
也在
update_output
回调 fxn 中:- 一个。将 df 的 'records' 更改为 'rows'。to_dict 方法调用
- 乙。你有 table 而不是 table_data 用于列 param
- C。在此处删除
id
Dash 参数的使用,b/c 它已经在布局中
return html.Div(
[
dash_table.DataTable(
data=table_data.to_dict("rows"),
columns=[{"id": x, "name": x} for x in table_data.columns],
)
]
)
- 看起来你调换了最大值和最小值! (最大零不会留下很多可能的输入![实际上,none..]);放置小数点和匹配精度也可能很重要,我添加以防万一。
html.Div(
dcc.Input(
id="input-box",
max=1.00,
min=0.00,
step=0.01,
value=threshold,
type="number"
)
),