新闻中心

Bokeh Plot:如何独立控制双Y轴的缩放

2025-11-06
浏览次数:
返回列表

bokeh plot:如何独立控制双y轴的缩放

本文介绍了在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="n*y", 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轴的范围不变。

刺鸟创客 刺鸟创客

一款专业高效稳定的AI内容创作平台

刺鸟创客 110 查看详情 刺鸟创客

以下是一个示例代码:

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="n*y", 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对象,该对象包含一个J*aScript回调函数。该回调函数在第一个Y轴的范围发生变化时被触发。在回调函数中,我们可以获取缩放后的第一个Y轴的范围,并根据需要更新第二个Y轴的范围。在本例中,我们注释掉了更新y2_range的代码,这意味着第二个Y轴的范围将保持不变。

注意事项

  • 回调函数是在浏览器端执行的,因此需要使用J*aScript编写。
  • 回调函数可以访问Bokeh绘图对象和模型,但不能直接修改Python变量。
  • 过度使用回调函数可能会影响绘图的性能。

总结

通过正确配置extra_y_ranges和使用callbacks,可以在Bokeh中创建具有双Y轴的绘图,并实现独立控制每个Y轴的缩放功能。这种方法可以更灵活地展示数据,并提高用户体验。通过自定义callback函数,可以实现更加复杂的交互行为,例如,根据第一个Y轴的缩放比例来动态调整第二个Y轴的范围。

以上就是Bokeh Plot:如何独立控制双Y轴的缩放的详细内容,更多请关注其它相关文章!


# 可以实现  # 软件营销推广渠道  # 抖音seo搜索效果分析  # 看网站建设需要啥条件  # 湖北网站优化推荐服务  # 根河微网站建设  # 苏州高效营销推广公司  # 鞍山网站优化服务  # 太原餐饮营销推广公司  # 百度营销如何关闭推广  # 牟平智能营销网站优化  # 更灵活  # 是一个  # 高分  # javascript  # 有效地  # 我们可以  # 其中一个  # 第一个  # 回调  # 第二个  # 浏览器端  # 工具  # 回调函数  # 浏览器  # js  # java  # python 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 漫蛙官网正版漫画入口 漫蛙2官方网页登录地址  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】  Typer应用中灵活处理命令行参数的令牌化与解析  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  高德地图怎么看全景照片_高德地图全景照片浏览教程  J*aScript中如何高效提取对象指定属性  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  漫蛙漫画网页端入口 漫蛙2官方正版漫画站点  谷歌邮箱注册显示错误Gmail服务器异常与延迟处理  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  TikTok网页版直接登录 TikTok网页端官方平台入口  如何在Python中使用Optional类型处理可变对象并避免Pylint警告  12306几点到几点不能订票? | 官方最新系统维护时间全解析  如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  Win11怎么修改默认浏览器_Windows 11设置Chrome为默认  最新韩小圈网页版登录入口_官网在线观看官方链接  解决Tabulator日期时间排序问题的专业指南  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  2026春节假期票务安排_2026春节放假购票指南  新手怎么开始学化妆 零基础化妆入门教程  BetterDiscord插件中安全更新用户简介的实践指南  百度网盘网页版入口 百度网盘网页版官方登录网址  HTML空白字符处理机制:渲染、DOM与编码实践  解决Python logging 中 datefmt 导致时间戳固定不变的问题  vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  2025年云电脑操作系统体验 | 无需本地硬件,随时随地使用高性能PC  网易大神账号申诉需要多久_网易大神账号申诉流程说明  QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录  将JSON对象数组转置为键值对列表的实用指南  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程  Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题  “在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法  谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】  俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航  HTML长属性值处理:表单action路径优化与代码规范应对  如何更改在 Excel 中打开超链接时的默认浏览器  MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复  J*aScript Promise链中如何正确终止后续.then执行并处理错误  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  微信商城在哪里打开【步骤】  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  Django模型中自动计算可用余额的实现方法  动漫岛观看全网网 动漫岛在线正版动漫入口 

搜索