You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 09:54:05