为什么我的 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图没有更新。