Python 如何使用不同的下拉菜单更新plotly graph dash

Python 如何使用不同的下拉菜单更新plotly graph dash,python,plotly,plotly-dash,Python,Plotly,Plotly Dash,我试图用两个不同的下拉列表作为输入来更新plotly graph dash 这是我的示例数据帧: import pandas as pd df1 = {'category' : ['A','A','A','B','B','B'],'subcategory' : ['x', 'y', 'z', 'x1','y1','z1'], 'x_coord' : [1, 2,3,2,2,2],'y_coord' : [1,3,2,1,3,2]} df_test = pd.DataFrame(df

我试图用两个不同的下拉列表作为输入来更新plotly graph dash

这是我的示例数据帧:

import pandas as pd
df1 = {'category' : ['A','A','A','B','B','B'],'subcategory' : ['x', 'y', 'z', 'x1','y1','z1'],
      'x_coord' : [1, 2,3,2,2,2],'y_coord' : [1,3,2,1,3,2]}

df_test = pd.DataFrame(df1)
df_test
我假装要做的是,如果我选择类别A,它会将所有对应点分散到类别中,但是如果我选择一个子类别,它会修改图形,只绘制数据框的对应类别子类别点

下面是代码,如果我只添加第一个下拉列表的回调,它就可以工作,但是当我将第二个回调添加到子类别时,它就不工作了。 我遵循dash plotly教程中的建议,其中指出:

但无论如何,如果我将输出放在单独的回调中,或者放在同一个回调中,我无法使其工作,下面是我尝试使用jupyter笔记本的代码:

import dash
import plotly as py
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import plotly.graph_objects as go
from jupyter_plotly_dash import JupyterDash
py.offline.init_notebook_mode(connected = True)

app = JupyterDash('Test')

app.layout = html.Div([
    dcc.Dropdown(id='dropdown1',
                 options=[{'label':i, 'value':i} for i in df_test['category'].unique()]),
    dcc.Dropdown(id='dropdown2',
                 options=[{'label':i, 'value':i} for i in df_test['subcategory'].unique()]),
    dcc.Graph(id='graphic')
])

@app.callback(
    Output('dropdown2', 'options'),
    [Input('dropdown1', 'value')])

def update_drop2(selected_drop):
    filtered_df = df_test[(df_test.category == selected_drop)]
    return [{'label':i, 'value':i} for i in filtered_df['subcategory'].unique()]

@app.callback(
    Output('graphic', 'figure'),
    [Input('dropdown1', 'value')])

def update_figure(selected_drop):

    filtered_df = df_test[(df_test.category == selected_drop)]

    fig = go.Figure()

    fig.add_trace(go.Scatter(x=filtered_df.x_coord,y=filtered_df.y_coord, marker = dict(size=15, color='green'), mode='markers'))

    return fig


@app.callback(
    Output('graphic', 'figure'),
    [Input('dropdown2', 'value')])

def update_figure(selected_drop):

    filtered_df = df_test[(df_test.subcategory == selected_drop)]

    fig = go.Figure()

    fig.add_trace(go.Scatter(x=filtered_df.x_coord,y=filtered_df.y_coord, marker = dict(size=15, color='green'), mode='markers'))

    return fig

app
如果我对回调使用多个输入,如下所示:

@app.callback(
Output('graphic', 'figure'),
[Input('dropdown1', 'value'), Input('dropdown2', 'value')])

def update_figure(selected_drop1, selected_drop2):

    if not selected_drop2:
        filtered_df = df_test[(df_test.category == selected_drop1)]
    else: 
        filtered_df = df_test[(df_test.category == selected_drop1) & 
                      (df_test.subcategory == selected_drop2)]
    fig = go.Figure()

    fig.add_trace(go.Scatter(x=filtered_df.x_coord,y=filtered_df.y_coord, 
    marker = dict(size=15, color='green'), mode='markers'))

    return fig
它比我想象的更好或者更接近,但是当我在类别之间切换时,我看不到任何数据


提前感谢您的帮助和建议。

我也遇到了类似的问题。诀窍是在第二个下拉列表中添加一个选项all。然后我想在第二个下拉列表中只显示给定类别中的子类别。所以我实际上对下拉菜单使用了2次回调,对绘图使用了1次回调

app.py

作为pd进口熊猫 导入操作系统 导入plotly.graph_objs作为go 导入破折号 将仪表板核心组件作为dcc导入 将dash_html_组件导入为html 从dash.dependencies导入输入,输出 数据帧{'category':['A','A','A','B','B','B'], ‘子类别’:[‘x’、‘y’、‘z’、‘x1’、‘y1’、‘z1’], “x_coord”:[1,2,3,2,2,2], ‘y_coord’:[1,3,2,1,3,2]} 类别清单 options1=sorteddf[category].unique.tolist 类别词典-子类别 all_options=df.groupbycategory[子类别].唯一\ .applylist.to_dict 我们将“所有”添加为每个类别的第一个子类别` 对于所有选项中的k、v。项目: 所有选项[k]。插入0,“全部” app=dash.dash app.layout=html.Div[ dcc.下拉列表 id='first-dropdown', options=[{'label':k,'value':k}表示所有_options.keys中的k], 值=选项1[0] , html.Hr, dcc.Dropdownid='second-dropdown', html.Hr, dcc.Graphid='display-selected-values' ] 以下两个回调生成一个dynamic 2选项 @app.callback dash.dependencies.Output'second-dropdown'、'options', [dash.dependencies.Input'first-dropdown','value'] def set_2_选项第一个选项: 在所有_选项[第一个_选项]中为i返回[{'label':i,'value':i}] @app.callback dash.dependencies.Output'second-dropdown'、'value', [dash.dependencies.Input'second-dropdown','options'] def set_2_值可用_选项: 返回可用的_选项[0]['value'] @app.callback dash.dependencies.Output'display-selected-values'、'figure', [dash.dependencies.Input'first-dropdown'、'value', dash.dependencies.Input'second-dropdown','value'] def更新图先选择后选择: 如果选择了_second==“全部”: ddf=df[df[类别]==选择的\u第一个] 其他: ddf=df[df[类别]==首先选定& df[子类别]==选定的\u秒] 图 图1添加_轨迹 go.Scatterx=ddf[x_坐标], y=ddf[y_坐标], marker=dictsize=15,颜色为绿色, mode='markers' 返回图 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app.run_serverdebug=True,端口=8051
@app.callback(
Output('graphic', 'figure'),
[Input('dropdown1', 'value'), Input('dropdown2', 'value')])

def update_figure(selected_drop1, selected_drop2):

    if not selected_drop2:
        filtered_df = df_test[(df_test.category == selected_drop1)]
    else: 
        filtered_df = df_test[(df_test.category == selected_drop1) & 
                      (df_test.subcategory == selected_drop2)]
    fig = go.Figure()

    fig.add_trace(go.Scatter(x=filtered_df.x_coord,y=filtered_df.y_coord, 
    marker = dict(size=15, color='green'), mode='markers'))

    return fig