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

使用hvplot时,如何移除Bokeh图表中的空分类?

解决hvplot非堆叠条形图的空分类占位问题

我需要绘制包含**分类(category)和子分类(subcategory)**的非堆叠条形图,要求当分类对应数值(value)不存在时,不显示该分类。但当前生成的图表里,B分类的X子分类、C分类的Y子分类位置是空的(无数据却保留了分类标签占位),示例代码和问题如下:

示例代码

import pandas as pd
import hvplot.pandas

df = pd.DataFrame({
    'category': ['A', 'A', 'B', 'B', 'C', 'C'],
    'subcategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
    'value': [10, 20, 0, 30, 40, 0]
})

df_filtered = df[df['value'] != 0]

grouped = df_filtered.groupby(['category', 'subcategory']).sum()

grouped.hvplot.bar(stacked=False, by='category')

问题原因

原代码中groupby生成的多级索引会让hvplot默认对齐所有原始子分类的组合,即便某些组合已被过滤掉,仍会保留空占位。

解决方法

直接使用过滤后的DataFrame,明确指定x轴为子分类,按分类分组绘图,这样只有存在有效数据的分类-子分类组合才会被展示:

import pandas as pd
import hvplot.pandas

df = pd.DataFrame({
    'category': ['A', 'A', 'B', 'B', 'C', 'C'],
    'subcategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
    'value': [10, 20, 0, 30, 40, 0]
})

# 过滤value为0的行并重置索引
df_filtered = df[df['value'] != 0].reset_index(drop=True)

# 指定x轴为子分类,按分类分组绘制非堆叠条形图
df_filtered.hvplot.bar(
    x='subcategory',
    y='value',
    by='category',
    stacked=False,
    rot=0  # 可选,让x轴标签横向显示,更易读
)

这样处理后,B分类只会显示Y子分类的条形,C分类只会显示X子分类的条形,不会再出现空分类占位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:35:02