Python 如何使用不同的下拉菜单更新plotly graph dash
我试图用两个不同的下拉列表作为输入来更新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
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