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
相关产品推荐
相关产品推荐

