Python Bokeh绘制三级分类柱状图失败,请求技术协助
求助:Bokeh三级分类柱状图无法正常运行排查
我尝试用Python的Bokeh库绘制三级分类柱状图,但绘图功能一直无法正常运行,希望能帮忙排查问题。以下是我的代码:
from bokeh.models import ColumnDataSource, FactorRange from bokeh.io import show p = figure(plot_height=250, title="Fruit Counts by Year") #tp是我的pandas DataFrame数据 x1=list(tp['SRN']) x2=list(tp['SN']) x3=list(tp['PN']) counts = list(tp['VS.FEGE.RXMAXSPEED']) x=[("SRN"+str(a1),"SN"+str(a2),"pN"+str(a3)) for a1,a2,a3 in zip(x1,x2,x3...
看了你的代码,我发现几个关键问题导致绘图无法正常运行:
- 缺少
figure类的导入:你只导入了ColumnDataSource和FactorRange,但figure是从bokeh.plotting模块导入的,没有这一行会直接触发NameError。 - 语法错误:列表推导式的
zip(x1,x2,x3...没有闭合括号,代码连执行都通不过。 - 核心绘图逻辑缺失:你没有创建数据源关联数据,也没有调用
vbar方法绘制柱状图,最后也没调用show(p)显示图表。
这里给你修正后的完整代码示例,你可以参考调整:
from bokeh.models import ColumnDataSource, FactorRange from bokeh.plotting import figure, show import pandas as pd # 这里是模拟你的tp DataFrame,替换成你的真实数据即可 tp = pd.DataFrame({ 'SRN': [1, 1, 2, 2], 'SN': [10, 20, 10, 20], 'PN': [100, 200, 100, 200], 'VS.FEGE.RXMAXSPEED': [50, 60, 70, 80] }) # 正确构建三级分类的x轴因子元组 x = [(f"SRN{a1}", f"SN{a2}", f"PN{a3}") for a1, a2, a3 in zip(tp['SRN'], tp['SN'], tp['PN'])] counts = tp['VS.FEGE.RXMAXSPEED'].tolist() # 创建Bokeh的数据源对象 source = ColumnDataSource(data=dict(x=x, counts=counts)) # 创建figure时必须指定x_range为FactorRange,适配三级分类结构 p = figure(plot_height=250, title="Fruit Counts by Year", x_range=FactorRange(*x)) # 绘制柱状图,关联数据源中的字段 p.vbar(x='x', top='counts', width=0.9, source=source) # 旋转x轴标签,避免长标签重叠影响可读性 p.xaxis.major_label_orientation = 1.2 # 显示图表 show(p)
主要修正点说明:
- 补充了
from bokeh.plotting import figure的导入,解决figure未定义的问题。 - 补全了列表推导式的语法,确保代码能正常解析。
- 创建
ColumnDataSource来管理数据,这是Bokeh处理数据的标准方式,也能更好地支持后续交互功能。 - 初始化
figure时指定x_range=FactorRange(*x),让x轴正确识别三级分类的因子结构。 - 添加
vbar方法绘制柱状图,绑定x轴和数值字段。 - 调整x轴标签的旋转角度,避免三级分类的长标签互相重叠。
- 最后调用
show(p)来渲染并打开图表。
你可以把自己的真实数据替换掉示例中的tp DataFrame,然后运行代码试试,如果还有问题可以再补充报错信息或者数据结构细节~
内容的提问来源于stack exchange,提问作者Sadegh
相关产品推荐
相关产品推荐

