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

Plotly JupyterDash按categoryorder排序含负值指标时未删无关列问题

问题解决:Plotly轴排序后Dash回调过滤数据不生效问题

问题表现

基于sales列对图表Y轴进行降序排序,配置fig.update_layout(yaxis={'categoryorder':'total descending'})后,在RadioItems中选择「099」过滤数据时,Y轴依然保留了不属于099团队的N A、P O、T B三个无关分类项。

根因说明

Plotly开启categoryorder基于数值排序时,会默认复用Dash回调上下文内的历史分类值,当当前数据集存在负值时,自动轴范围计算会覆盖到旧分类的展示区间,导致无关分类残留。

解决方案

修改回调中的轴配置,显式指定Y轴的可选分类为当前过滤后的name列值即可,无需修改其他逻辑,修改后的回调代码如下:

@app.callback(
    Output("sales_graph", "figure"),
    [
        Input("slm-radio", "value")
    ],
)
def history_graph(team):
    dataset  = df1
        
    if team != 'All':
        dataset = dataset[dataset['team']==team]
    
    v_cat = dataset['name']
    x_val = dataset['sales']

    fig = go.Figure(go.Bar(
        x=x_val,
        y=v_cat,
        marker_color="#ff0000",
        orientation='h',
        width=0.25
        ))
    fig.update_layout(template='plotly_dark')
    # 显式指定当前数据集的分类列表,避免历史分类残留
    fig.update_layout(yaxis={
        'categoryorder':'total descending',
        'categoryarray': v_cat.tolist()
    })    

    return fig

验证场景说明

你之前测试的三个场景可正常生效的原因如下:

  • 将「Ho A」对应的sales值修改为正数:此时Plotly自动计算的轴范围不会覆盖旧分类的展示区间,因此不会显示无关行
  • 移除轴排序相关配置:关闭categoryorder后Plotly默认仅使用当前传入数据集的分类项,不会保留历史值
  • 本地直接用Plotly渲染:每次渲染为全新Figure实例,不存在Dash回调的上下文缓存,因此不会残留旧分类

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:06:01