在Bokeh的双Y轴绘图场景中,默认的交互缩放行为是同时作用于两个Y轴,当我们需要单独调整某一个Y轴的显示范围,而不影响另一个Y轴的数据展示时,就需要对Y轴的缩放配置进行自定义设置。Bokeh本身提供了灵活的交互工具配置能力,通过修改工具的关联轴参数即可实现单个Y轴的独立缩放。

核心实现原理
Bokeh的交互工具(如滚轮缩放、框选缩放)默认会绑定到图表的所有轴,要实现单个Y轴独立缩放,核心思路是:为需要独立缩放的Y轴单独创建专属的缩放工具,并且让该工具仅关联目标Y轴,不关联另一个Y轴和其他轴。
关键配置点有两个:
- 使用
WheelZoomTool或BoxZoomTool时,通过dimensions参数指定缩放方向为垂直方向(仅影响Y轴) - 通过
scales参数指定该缩放工具仅作用于目标Y轴,不作用于其他轴
完整实现代码示例
以下代码演示了创建双Y轴图表,并且仅让右侧Y轴支持独立缩放的实现过程:
from bokeh.plotting import figure, show
from bokeh.models import LinearAxis, Range1d, WheelZoomTool
# 创建基础图表,默认左侧Y轴
p = figure(width=800, height=400, title="双Y轴单个轴独立缩放示例")
# 添加第一条数据,使用左侧Y轴
p.line([1, 2, 3, 4, 5], [10, 20, 30, 40, 50], color="blue", legend_label="左侧数据")
# 配置右侧Y轴
p.extra_y_ranges["right_y"] = Range1d(start=0, end=100)
p.add_layout(LinearAxis(y_range_name="right_y", axis_label="右侧Y轴"), 'right')
# 添加第二条数据,使用右侧Y轴
p.line([1, 2, 3, 4, 5], [60, 70, 80, 90, 100], color="red", y_range_name="right_y", legend_label="右侧数据")
# 创建仅作用于右侧Y轴的滚轮缩放工具
right_y_zoom = WheelZoomTool(dimensions="height", scales={"y": p.extra_y_ranges["right_y"]})
# 创建仅作用于左侧Y轴的滚轮缩放工具
left_y_zoom = WheelZoomTool(dimensions="height", scales={"y": p.y_range})
# 清空默认工具,添加自定义工具
p.tools = [right_y_zoom, left_y_zoom]
show(p)
代码参数说明
| 参数 | 说明 |
|---|---|
| dimensions | 设置为"height"时,缩放工具仅影响垂直方向(Y轴),设置为"width"仅影响水平方向(X轴),"both"则同时影响两个方向 |
| scales | 字典类型参数,键为轴类型("x"或"y"),值为要绑定的轴对象,这里指定仅绑定目标Y轴 |
| extra_y_ranges | 用于存储额外Y轴的范围配置,键为Y轴名称,值为Range1d对象 |
注意事项
如果需要禁用某个Y轴的缩放,只需要不把对应的缩放工具绑定到该轴即可。另外,框选缩放工具BoxZoomTool的配置方式和滚轮缩放工具一致,只需要把WheelZoomTool替换为BoxZoomTool,同时调整scales参数即可实现框选独立缩放的效果。
当图表存在多个Y轴时,建议为每个需要独立交互的Y轴都创建专属的缩放工具,避免默认工具的全局绑定导致缩放行为不符合预期。