Python Dash基于选中基准唯一值绘制交互式权重条形图问题求助
你代码存在以下几个问题导致回调失效:
- 未按照选中的基准值过滤源数据,原代码中
dff = df.BM_NAME.unique()是错误写法,没有保留选中基准对应的指数权重数据 - 绘图时x参数使用了未定义的
filtered_BM变量,触发名称错误 - 未处理下拉框清空的情况,当你取消选中基准时
selected_BM为None,直接调用会报错
修正后的完整可运行代码如下:
import pandas as pd import dash import dash_html_components as html import dash_core_components as dcc from dash.dependencies import Input, Output import plotly.express as px # 测试数据 data = [['A', 'B', 0.4], ['A', 'C', 0.5], ['A', 'D', 0.1], ['X', 'Y', 0.15], ['X', 'Z', 0.85]] df = pd.DataFrame(data, columns = ['BM_NAME', 'INDEX_NAME', 'WEIGHT']) # 创建Dash应用 app = dash.Dash() # 布局配置 app.layout = html.Div(children=[ html.H1(children='基准成分权重'), dcc.Dropdown(id='BM-dropdown', options=[{'label': x, 'value': x} for x in df.BM_NAME.unique()], value='A', multi=False, clearable=True), dcc.Graph(id='bar-chart') ]) # 回调函数 @app.callback( Output(component_id="bar-chart", component_property="figure"), Input(component_id="BM-dropdown", component_property="value"), ) def display_BM_composition(selected_BM): # 处理清空场景,返回空图 if not selected_BM: return px.bar() # 按选中的基准过滤数据 filtered_df = df[df['BM_NAME'] == selected_BM] # 生成条形图,x轴用指数名称,更直观展示各指数权重 barchart = px.bar( data_frame=filtered_df, x="INDEX_NAME", y="WEIGHT", color="INDEX_NAME", opacity=0.9, title=f"基准{selected_BM}成分权重配置" ) return barchart # 启动服务,Jupyter环境下use_reloader设为False避免冲突 if __name__ == '__main__': app.run_server(debug=True, use_reloader=False)
如果需要保留原来x轴为基准名称的展示逻辑,只需要把x参数改回"BM_NAME"、添加barmode='group'即可,不影响交互逻辑。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

