如何在Bokeh双Y轴Vbar图中实现两组条形并列显示
解决Bokeh双Y轴条形图重叠问题
要让两组条形按月度并列显示,核心是给两组条形的X坐标分别加/减偏移量,让它们错开分布在刻度两侧。具体操作如下:
修改步骤
- 生成偏移后的X坐标:Bokeh的分类X轴会把每个月份映射为0、1、2...这样的整数索引,给第一组条形的X坐标减去固定偏移,第二组加上偏移,就能实现左右并列。
- 调整条形宽度:确保两组条形的总宽度不超过1(避免相邻月份的条形互相挤压),比如每组宽度设为0.4,偏移量设为0.2(刚好是宽度的一半,让条形对称分布在刻度两侧)。
修改后的完整代码
from bokeh.models import Range1d, LinearAxis from bokeh.plotting import figure # 假设months、dataP、dataI、title已提前定义 p = figure(title=title, plot_width=1000, plot_height=350, x_range=months, y_range=(0, max(dataP) * 1.2), tools="box_zoom, pan, reset, hover, save", active_drag='box_zoom') # 定义偏移量和条形宽度 offset = 0.2 bar_width = 0.4 # 第一组条形:X坐标左移偏移量 p.yaxis.axis_label = 'dataP label' p.vbar(x=[i - offset for i in range(len(months))], top=dataP, color='blue', width=bar_width) # 第二组条形:X坐标右移偏移量 p.extra_y_ranges = {"foo": Range1d(start=0, end=max(dataI) * 1.2)} p.vbar(x=[i + offset for i in range(len(months))], top=dataI, color="red", y_range_name="foo", width=bar_width) p.add_layout(LinearAxis(y_range_name="foo", axis_label="dataI label"), 'right')
注意事项
- 偏移量和宽度要匹配:比如宽度设为0.4,偏移量设为0.2,这样两个条形刚好对称分布在刻度两侧,且总宽度0.8小于1,不会和相邻月份的条形重叠。
- 如果需要更宽的条形,可以适当调整宽度(比如0.45)和偏移量(0.225),只要总宽度≤1即可。
内容的提问来源于stack exchange,提问作者Sara.SP92
相关产品推荐
相关产品推荐

