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

Bokeh/Python中四级分类柱状图实现及多图合并对比求助

合并两个三级分类柱状图的解决方案

别担心,虽然Bokeh的FactorRange文档标注支持三级,但我们可以通过嵌套因子组合的方式,把两个系列(红色/蓝色)作为额外的分组维度,轻松实现同图对比。下面是具体的实现步骤和代码示例:

核心思路

我们把原来的三级分类(比如level1/level2/level3)和系列标识(比如RX/FE)组合成新的x轴因子,让每个三级分类下对应两个并排的柱子(分别对应两个系列)。这样既不违反FactorRange的使用逻辑,又能实现对比需求。

具体代码实现

假设你的原始数据是两个数据集(RX和FE),每个都包含三级分类字段和对应的数值,我们可以这样改造:

from bokeh.models import ColumnDataSource, FactorRange
from bokeh.plotting import figure, show

# ---------------------- 1. 准备数据(替换成你的实际数据) ----------------------
rx_data = {
    "level1": ["GroupA", "GroupA", "GroupB", "GroupB"],
    "level2": ["SubA1", "SubA2", "SubB1", "SubB2"],
    "level3": ["Item1", "Item2", "Item1", "Item2"],
    "value": [18, 25, 12, 30]
}

fe_data = {
    "level1": ["GroupA", "GroupA", "GroupB", "GroupB"],
    "level2": ["SubA1", "SubA2", "SubB1", "SubB2"],
    "level3": ["Item1", "Item2", "Item1", "Item2"],
    "value": [22, 20, 15, 27]
}

# ---------------------- 2. 构造嵌套的x轴因子 ----------------------
# 提取共同的三级分类组合(如果两个数据集分类一致的话)
categories = list(zip(rx_data["level1"], rx_data["level2"], rx_data["level3"]))
series = ["RX", "FE"]  # 你的两个系列标识

# 生成所有x轴因子:(三级分类组合, 系列)
factors = [(cat, s) for cat in categories for s in series]

# ---------------------- 3. 转换数据为Bokeh可用的格式 ----------------------
rx_source = ColumnDataSource(data=dict(
    x=[(cat, "RX") for cat in categories],
    top=rx_data["value"]
))

fe_source = ColumnDataSource(data=dict(
    x=[(cat, "FE") for cat in categories],
    top=fe_data["value"]
))

# ---------------------- 4. 创建图表并绘制 ----------------------
p = figure(
    x_range=FactorRange(factors=factors),
    plot_height=250,
    plot_width=1000,
    title="VS.FEGE.RXMAXSPEED",
    toolbar_location="right"
)

# 绘制两个系列的柱状图,设置宽度让它们并排
p.vbar(x="x", top="top", width=0.4, source=rx_source, color="red", legend_label="RX")
p.vbar(x="x", top="top", width=0.4, source=fe_source, color="blue", legend_label="FE")

# ---------------------- 5. 优化图表样式 ----------------------
# 旋转x轴标签避免重叠
p.xaxis.major_label_orientation = 1.2
# 设置y轴从0开始,更直观
p.y_range.start = 0
# 调整图例位置
p.legend.location = "top_left"

show(p)

关键细节说明

  1. 因子组合:我们用(三级分类元组, 系列)作为x轴的每个因子,Bokeh会自动识别这种嵌套结构,将同一个三级分类下的两个系列柱子放在一起。
  2. 宽度调整:把每个柱子的宽度设为0.4,这样两个柱子加起来宽度小于1,会自动留出间隔,避免重叠。
  3. 兼容三级限制:如果严格遵循文档的三级限制,你也可以把三级分类合并成一个字符串(比如f"{l1}-{l2}-{l3}"),然后用(合并后的分类字符串, 系列)作为因子,效果是一样的。

这样就能把你原来的两个三级柱状图合并到同一个图表里,实现直观的对比啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:46:30