为什么我的 dash 应用程序不使用 RadioItems 更新
Why does my dash app not update with RadioItems
在下面的 dash 应用程序中,我的图形图例仅在我更改 'points_category' 的值时更新 - 如果我单击 'legend_display' 对象上的按钮,则图例不会出现或消失,直到我更改了 'points_category' 对象中的一个值。
谁能解释原因,以及如何在我更改任一值时更新应用程序?
谢谢!
蒂姆
import sys
import dash
from dash import dcc
from dash import html
from dash.dependencies import Input, Output
app = dash.Dash(__name__)
tab_names = ['KnownClusterBlast', 'ClusterBlast']
app.layout = html.Div([
dcc.Tabs(id='choose_clusterblast',
value='ClusterBlast',
children=[
dcc.Tab(label='ClusterBlast', value='ClusterBlast'),
dcc.Tab(label='KnownClusterBlast', value='KnownClusterBlast')]),
dcc.RadioItems(options=[{'label': 'homolog_bgc_type',
'value': 'homolog_bgc_type'},
{'label': 'genus',
'value': 'genus'},
{'label': 'species',
'value': 'species'},
{'label': 'strain',
'value': 'strain'}],
value = 'genus',
id = 'points_category'),
dcc.RadioItems(options=[{'label': 'show_legend',
'value': 'show_legend'},
{'label': 'dont_show_legend',
'value': 'dont_show_legend'}],
value = 'dont_show_legend',
id = 'legend_display'),
dcc.Graph(id = 'scatter_graph')])
@app.callback(
[Output('scatter_graph', 'figure')],
[Input('choose_clusterblast', 'value'),
Input('points_category', 'value'),
Input('legend_display', 'value')]
)
def update_figure(type_clusterblast, category_colour, legend_display):
if type_clusterblast == 'KnownClusterBlast':
df = known_clusterblast_df
elif type_clusterblast == 'ClusterBlast':
df = clusterblast_df
else:
sys.exit('error')
fig = px.scatter(df,
x="homolog_percent",
y="multigeneblast_score",
color = category_colour,
range_x = [0, 100],
range_y = [0, max(df['multigeneblast_score']) * 1.1],
height = 750,
width = 2000)
if legend_display == 'dont_show_legend':
fig.update_layout(showlegend=False)
elif legend_display == 'show_legend':
fig.update_layout(showlegend=True)
else:
sys.exit()
fig.update_layout(transition_duration=500)
return [fig]
if __name__ == '__main__':
app.run_server(debug=True)
要解决此问题,请删除过渡,以下行:
fig.update_layout(transition_duration=500)
看来是更新布局和回调速度不同步的问题。回调不能等待布局的更新来更新图例,它只returns图没有更新。
在下面的 dash 应用程序中,我的图形图例仅在我更改 'points_category' 的值时更新 - 如果我单击 'legend_display' 对象上的按钮,则图例不会出现或消失,直到我更改了 'points_category' 对象中的一个值。
谁能解释原因,以及如何在我更改任一值时更新应用程序?
谢谢! 蒂姆
import sys
import dash
from dash import dcc
from dash import html
from dash.dependencies import Input, Output
app = dash.Dash(__name__)
tab_names = ['KnownClusterBlast', 'ClusterBlast']
app.layout = html.Div([
dcc.Tabs(id='choose_clusterblast',
value='ClusterBlast',
children=[
dcc.Tab(label='ClusterBlast', value='ClusterBlast'),
dcc.Tab(label='KnownClusterBlast', value='KnownClusterBlast')]),
dcc.RadioItems(options=[{'label': 'homolog_bgc_type',
'value': 'homolog_bgc_type'},
{'label': 'genus',
'value': 'genus'},
{'label': 'species',
'value': 'species'},
{'label': 'strain',
'value': 'strain'}],
value = 'genus',
id = 'points_category'),
dcc.RadioItems(options=[{'label': 'show_legend',
'value': 'show_legend'},
{'label': 'dont_show_legend',
'value': 'dont_show_legend'}],
value = 'dont_show_legend',
id = 'legend_display'),
dcc.Graph(id = 'scatter_graph')])
@app.callback(
[Output('scatter_graph', 'figure')],
[Input('choose_clusterblast', 'value'),
Input('points_category', 'value'),
Input('legend_display', 'value')]
)
def update_figure(type_clusterblast, category_colour, legend_display):
if type_clusterblast == 'KnownClusterBlast':
df = known_clusterblast_df
elif type_clusterblast == 'ClusterBlast':
df = clusterblast_df
else:
sys.exit('error')
fig = px.scatter(df,
x="homolog_percent",
y="multigeneblast_score",
color = category_colour,
range_x = [0, 100],
range_y = [0, max(df['multigeneblast_score']) * 1.1],
height = 750,
width = 2000)
if legend_display == 'dont_show_legend':
fig.update_layout(showlegend=False)
elif legend_display == 'show_legend':
fig.update_layout(showlegend=True)
else:
sys.exit()
fig.update_layout(transition_duration=500)
return [fig]
if __name__ == '__main__':
app.run_server(debug=True)
要解决此问题,请删除过渡,以下行:
fig.update_layout(transition_duration=500)
看来是更新布局和回调速度不同步的问题。回调不能等待布局的更新来更新图例,它只returns图没有更新。