
本文介绍了在Bokeh中创建具有双Y轴的绘图,并实现独立控制每个Y轴的缩放功能。通过正确配置`extra_y_ranges`和使用`callbacks`,可以实现只缩放其中一个Y轴,而保持另一个Y轴的范围固定,从而更灵活地展示数据。
在Bokeh中创建具有双Y轴的绘图是一种常见的需求,例如,当需要在同一图表中展示具有不同量纲或数量级的数据时。然而,默认情况下,Bokeh的缩放工具会同时影响所有的Y轴。本教程将介绍如何实现独立控制双Y轴的缩放,即只缩放其中一个Y轴,而保持另一个Y轴的范围固定。
创建双Y轴绘图
首先,我们需要创建一个包含双Y轴的Bokeh绘图。这可以通过使用extra_y_ranges参数来实现。
from bokeh.plotting import figure, show
from bokeh.models import Range1d
# 创建数据
x = [1, 2, 3, 4, 5]
y1 = [6, 7, 2, 4, 5]
y2 = [2, 3, 4, 5, 6]
# 创建绘图对象
p = figure(width=400, height=400)
# 添加第一个Y轴的数据
p.line(x, y1, color="navy", legend_label="Line 1")
# 创建第二个Y轴的范围
p.extra_y_ranges = {"y2": Range1d(start=0, end=10)}
# 添加第二个Y轴的数据
p.line(x, y2, color="firebrick", legend_label="Line 2", y_range_name="y2")
# 添加第二个Y轴
p.add_layout(LinearAxis(y_range_name="y2"), 'right')
show(p)在上面的代码中,我们首先创建了一个figure对象。然后,我们使用p.line()函数添加了第一条线的数据。为了创建第二个Y轴,我们使用了p.extra_y_ranges参数,并指定了第二个Y轴的范围。然后,我们再次使用p.line()函数添加了第二条线的数据,并指定了y_range_name参数为"y2",以将这条线与第二个Y轴关联起来。最后,使用p.add_layout()添加第二个Y轴到绘图的右侧。
独立控制Y轴缩放
默认情况下,Bokeh的缩放工具会同时影响两个Y轴。要实现独立控制Y轴的缩放,我们需要使用callbacks。具体来说,我们可以监听缩放事件,并手动更新其中一个Y轴的范围,而保持另一个Y轴的范围不变。
以下是一个示例代码:
from bokeh.plotting import figure, show
from bokeh.models import Range1d, LinearAxis, CustomJS
# 创建数据
x = [1, 2, 3, 4, 5]
y1 = [6, 7, 2, 4, 5]
y2 = [2, 3, 4, 5, 6]
# 创建绘图对象
p = figure(width=400, height=400, tools="wheel_zoom, pan, reset")
# 添加第一个Y轴的数据
line1 = p.line(x, y1, color="navy", legend_label="Line 1")
# 创建第二个Y轴的范围
y2_range = Range1d(start=0, end=10)
p.extra_y_ranges = {"y2": y2_range}
# 添加第二个Y轴的数据
line2 = p.line(x, y2, color="firebrick", legend_label="Line 2", y_range_name="y2")
# 添加第二个Y轴
axis2 = LinearAxis(y_range_name="y2")
p.add_layout(axis2, 'right')
# 创建回调函数
callback = CustomJS(args=dict(y2_range=y2_range, y1_range=p.y_range), code="""
// 获取缩放后的第一个Y轴的范围
const start = y1_range.start;
const end = y1_range.end;
// 在这里可以添加逻辑来限制第二个Y轴的范围
// 例如,保持第二个Y轴的范围不变
// 或者根据第一个Y轴的范围来调整第二个Y轴的范围
// 更新第二个Y轴的范围
//y2_range.start = start;
//y2_range.end = end;
""")
# 绑定回调函数到第一个Y轴的范围
p.y_range.js_on_change('start', callback)
p.y_range.js_on_change('end', callback)
show(p)在这个例子中,我们首先创建了一个CustomJS对象,该对象包含一个JavaScript回调函数。该回调函数在第一个Y轴的范围发生变化时被触发。在回调函数中,我们可以获取缩放后的第一个Y轴的范围,并根据需要更新第二个Y轴的范围。在本例中,我们注释掉了更新y2_range的代码,这意味着第二个Y轴的范围将保持不变。
注意事项
总结
通过正确配置extra_y_ranges和使用callbacks,可以在Bokeh中创建具有双Y轴的绘图,并实现独立控制每个Y轴的缩放功能。这种方法可以更灵活地展示数据,并提高用户体验。通过自定义callback函数,可以实现更加复杂的交互行为,例如,根据第一个Y轴的缩放比例来动态调整第二个Y轴的范围。
以上就是Bokeh Plot:如何独立控制双Y轴的缩放的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号