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)
关键细节说明
- 因子组合:我们用
(三级分类元组, 系列)作为x轴的每个因子,Bokeh会自动识别这种嵌套结构,将同一个三级分类下的两个系列柱子放在一起。 - 宽度调整:把每个柱子的宽度设为
0.4,这样两个柱子加起来宽度小于1,会自动留出间隔,避免重叠。 - 兼容三级限制:如果严格遵循文档的三级限制,你也可以把三级分类合并成一个字符串(比如
f"{l1}-{l2}-{l3}"),然后用(合并后的分类字符串, 系列)作为因子,效果是一样的。
这样就能把你原来的两个三级柱状图合并到同一个图表里,实现直观的对比啦!
内容的提问来源于stack exchange,提问作者Sadegh
相关产品推荐
相关产品推荐

