使用Bokeh实现嵌套柱状图时触发ValueError错误求助
解决Bokeh嵌套柱状图的FactorRange错误
嘿,我刚帮你排查了问题,你遇到的这个ValueError完全是因为生成x轴分类的逻辑出了问题——Bokeh的FactorRange要求的是一系列具体的分类组合元组,但你现在的代码把整个请求类型列表和状态列表直接塞进了元组里,这肯定不符合要求。
先看你原来的x生成代码:
x=[(jobemergence,jobstatus)for job in jobemergence for stat in jobstatus]
这会生成一堆像([所有请求类型], [所有状态])的重复元组,而Bokeh需要的是类似('Access Cards/ FOBs/ Keys', 'Open')、('Access Cards/ FOBs/ Keys', 'In Progress')这种每个请求类型和状态一一配对的元组。
下面是完整的修正代码,我标注了关键的修改点:
from bokeh.io import output_file, show from bokeh.models import ColumnDataSource, FactorRange from bokeh.plotting import figure from bokeh.transform import factor_cmap from bokeh.palettes import Spectral3 def visualEmergence(): # 给输出文件加上.html后缀,方便定位 output_file("EmergencyOverview.html") jobemergence=['Access Cards/ FOBs/ Keys','Plumbing','QR Demo Request Type','Demo Request Type','Other','ThisRequestType1'] jobstatus=['Open','In Progress','Completed'] graphdata={ 'jobemergence':jobemergence, 'Open':[4,3,0,4,0,1], 'In Progress':[2,1,2,4,0,0], 'Completed':[1,1,1,1,1,0] } # 关键修正:生成每个请求类型+状态的配对元组 x = [(job, stat) for job in jobemergence for stat in jobstatus] stackvalue = sum(zip(graphdata['Open'], graphdata['In Progress'], graphdata['Completed']), ()) source = ColumnDataSource(data=dict(x=x, count=stackvalue)) plot = figure(x_range=FactorRange(*x), plot_height=250, title='Emergency Request Overview') # 修正top参数为数据源里的count字段,同时调整颜色映射的参数 plot.vbar(x='x', top='count', width=0.9, source=source, line_color="white", fill_color=factor_cmap('x', palette=Spectral3, factors=jobstatus, start=1, end=2)) plot.y_range.start=0 plot.x_range.range_padding=0.1 plot.xaxis.major_label_orientation=1 plot.xaxis.grid_line_color=None show(plot) # 别忘了调用函数 visualEmergence()
再给你梳理几个核心的修正细节:
- x轴分类修正:用
(job, stat)生成具体的分类组合,这才是FactorRange能识别的格式。 - 颜色映射调整:因为现在x是二元组,我们要基于元组的第二个元素(状态)来配色,所以
start=1、end=2,同时换成Spectral3调色板(刚好匹配3种状态)。 - vbar参数修正:原来的
top='stackvalue'写错了,应该对应数据源里的count字段。 - 文件后缀补充:给
output_file加上.html后缀,避免生成无后缀的文件不好打开。
运行修正后的代码就能正常生成嵌套柱状图啦!
内容的提问来源于stack exchange,提问作者Kalyan
相关产品推荐
相关产品推荐

