使用Bokeh绘制MultiIndex分组DataFrame柱状图时x_range报错如何解决
Bokeh绘制MultiIndex分组DataFrame柱状图解决方案
报错根本原因:Bokeh分类轴的取值仅支持字符串或字符串组成的元组,原生MultiIndex的Python元组结构无法被识别,统一转换为字符串格式即可解决。
通用实现代码(适配1-3个分组变量场景)
import pandas as pd from bokeh.plotting import figure, show from bokeh.models import ColumnDataSource # 原有数据读取逻辑 data = pd.read_csv('CompanyStructure.csv', index_col = 0) # 可自定义分组字段,支持1-3个变量动态切换 group_cols = ['hour', 'Code', 'Type'] grouped = data.groupby(by=group_cols).sum().reset_index() # 核心:生成Bokeh可识别的分类x轴标签 # 按分组字段拼接为唯一字符串,自动适配任意数量的分组变量 grouped['x_label'] = grouped[group_cols].apply(lambda x: '-'.join(map(str, x)), axis=1) # 构建数据源 source = ColumnDataSource(grouped) # 初始化画布,x_range直接传入生成的标签列表 p = figure(x_range = source.data['x_label'].tolist(), width=1200, height=500) # 绘制柱状图 p.vbar(x='x_label', top='Value', source=source, width=0.7) # 可选优化:倾斜x轴标签避免重叠 p.xaxis.major_label_orientation = 3.14/4 show(p)
动态切换分组的适配说明
如果需要实现交互切换分组变量的效果,仅需要修改group_cols的取值,x_label的生成逻辑无需调整即可自动适配新的分组规则。如需实现分组层级下钻等更复杂的交互,可结合Bokeh的CustomJS回调实现分组逻辑的动态更新。
内容的提问来源于stack exchange,提问作者David Halley
相关产品推荐
相关产品推荐

