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

如何动态创建堆叠条形图Trace?解决下拉菜单选择报错问题

解决动态生成堆叠条形图Trace的报错问题

你的问题核心在于硬编码了所有可能的Trace,但当下拉选项对应的数据集里没有某个Market segment时,访问该列就会抛出KeyError。解决思路很简单:不要提前写死所有Trace,而是根据当前pv中实际存在的列动态生成。

修改后的代码

pv = pd.pivot_table(
    df_plot, 
    index=['Year'], 
    columns=["Market segment"], 
    values=['Value'], 
    aggfunc=sum, 
    fill_value=0
)

# 动态获取当前pv中存在的Market segment
available_segments = pv.columns.get_level_values(1).tolist()

traces = []
for segment in available_segments:
    # 只生成存在数据的trace
    trace = go.Bar(
        x=pv.index,
        y=pv[("Value", segment)],
        name=segment
    )
    traces.append(trace)

return {
    'data': traces,
    'layout': go.Layout(
        title='Metric: {}'.format(Metric),
        barmode='stack'
    )
}

代码解释

  1. 获取可用的segment:利用pandas MultiIndex的get_level_values(1)方法,提取出当前pv中第二级(也就是"Market segment")的所有类别,这样就能得到当前数据集里实际存在的segment列表。
  2. 循环生成Trace:遍历每个可用的segment,针对性地创建对应的Bar Trace,确保不会访问不存在的列,从根源避免报错。
  3. 返回动态生成的Trace列表:把生成的traces列表作为data返回,Plotly会自动处理堆叠显示。

额外优化建议

如果希望Trace的显示顺序固定(比如不管有没有数据,Residential始终排在最前面),可以提前定义一个优先级列表,然后按这个列表筛选可用的segment:

# 定义你想要的显示顺序
preferred_order = ["Residential", "Business – small", "Business – medium", "Business – micro", "Business – SME", "Business"]

# 只保留当前存在的segment,同时保持顺序
available_segments = [seg for seg in preferred_order if seg in pv.columns.get_level_values(1)]

这样即使某些segment不存在,剩下的Trace也会按照你想要的顺序展示,图表的可读性更好。

内容的提问来源于stack exchange,提问作者isic5

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:01:08