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

