拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Bokeh 0.12.5 版本解析:事件系统、Jupyter 内嵌、GMap 与主题机制的里程碑升级

Bokeh 0.12.5 版本解析事件系统、Jupyter 内嵌、GMap 与主题机制的里程碑升级【免费下载链接】bokehInteractive Data Visualization in the browser, from Python项目地址: https://gitcode.com/GitHub_Trending/bo/bokehBokeh 0.12.52017 年 3 月是一个增量更新版本在保持整体稳定的前提下加入了几项影响深远的核心能力通用的 Python/JS 事件系统、Jupyter Notebook 内嵌展示 Bokeh 应用、GMapPlot地图绘图的完善与gmap()便捷函数的引入以及主题Themes在components与 Notebook 中的生效。读懂这个版本的演进能帮助你理解 Bokeh 从静态图形库走向交互式 Web 数据可视化框架的关键路径本文以 0.12.5 发布说明 为主线结合当前仓库源码逐项深入。版本定位一次小步快跑的增量更新发布说明原文将其定位为an incremental update——添加少量重要特性并修复多个 bug。0.12.5 的亮点清单包括通用的 Python/JS 事件能力issues #3210、#3748、#5278Bokeh 应用可直接在 Jupyter Notebook 中内嵌查看issue #3461消除令人困惑的--host参数issue #5692交互式图例可控制图元glyph可见性issues #2274、#3715GMapPlot的大量修复与改进包括新增gmap函数issues #2822、#2940、#3737、#4835、#5592、#5826、#5845CustomJSTransform可用于 ColumnDataSource 列issue #5015社区贡献的pivot复杂示例应用issue #5894主题在components与 Jupyter Notebook 中生效issues #4722、#4952下面逐项展开并用当前仓库的源码印证这些特性的最终形态。核心能力一通用的 Python/JS 事件系统0.12.5 最重要的贡献是建立了统一的细粒度事件granular events机制用户可以在模型上注册回调当浏览器端发生特定交互点击、悬停、按钮按下等时触发 Python 代码配合 Bokeh server或 JavaScript 代码无需服务器。事件体系的分层结构从当前源码 src/bokeh/events.py 可以看到这套体系经过多年演进后的完整分层Event基类所有 Bokeh 事件的根类实现了Serializable协议。关键设计是每个具体事件类必须声明event_name类属性并借助__init_subclass__自动注册到全局表_CONCRETE_EVENT_CLASSES中Event.cls_for(event_name)即可按名称反查事件类。这意味着事件可以跨进程序列化——这正是浏览器端 JS 事件能映射回 Python 端回调的基础。DocumentEvent及其子类文档级事件如DocumentReady文档就绪、ConnectionLost连接断开、ClientReconnected客户端重连。ModelEvent及其子类模型级事件携带触发事件的模型引用。典型成员包括ButtonClick按钮点击仅接受按钮/按钮组模型、ValueSubmit文本输入提交携带value、FileInputChange文件选择变化携带内容、文件名与 MIME 类型、LegendItemClick图例项点击携带Legend模型与被点击的LegendItem、AxisClick坐标轴点击数值轴返回数值、对数轴返回 log 十进制刻度、分类轴返回最近分类因子、MenuItemClick等。PlotEvent及其子类绘图区事件。又细分为PointEvent基类携带屏幕坐标sx/sy、数据坐标x/y与修饰键modifiers其子类覆盖Tap、DoubleTap、Press、PressUp、MouseEnter、MouseLeave、MouseMove、MouseWheel、Pan/PanStart/PanEnd、Pinch系列触屏缩放、Rotate系列触屏旋转状态类事件LODStart/LODEnd交互式细节层级模式的开始与结束、RangesUpdate一次平移/缩放的完整范围更新以x0/x1/y0/y1四个属性打包成单个事件避免监听 range 属性时一次逻辑操作触发多次回调、SelectionGeometry选区几何坐标、ResetResetTool 点击。模块文档还特别提醒事件不做节流MouseMove等高频事件可能带来显著的网络流量与 CPU 开销——注册高频事件回调时应自行做去抖或降采样。两种回调注册方式方式一纯 JS 回调js_on_eventCustomJS无需 Bokeh server。Model.js_on_event的实现见 src/bokeh/model/model.py它接受事件类或事件名字符串将回调去重后追加到模型的js_event_callbacks属性中JS 回调执行时cb_obj即触发回调的具体事件对象。文档中的标准示例from bokeh.events import ButtonClick from bokeh.models import Button, CustomJS button Button() button.js_on_event(ButtonClick, CustomJS(codeconsole.log(JS:Click)))方式二Python 回调on_event要求应用运行在 Bokeh server 上下文中回调函数接受单个event参数from bokeh.events import ButtonClick from bokeh.models import Button button Button() def callback(event): print(Python:Click) button.on_event(ButtonClick, callback)从源码结构看Python 侧的on_event与 JS 侧的js_on_event共用同一套事件名称解析Event.cls_for服务端收到序列化事件后按event_name查找类并实例化再分发到对应回调——0.12.5 引入的这套事件名 可序列化值的协议一直沿用至今。核心能力二Jupyter Notebook 中内嵌展示 Bokeh 应用0.12.5 使在 Notebook 单元中直接查看 Bokeh 应用成为一等公民issue #3461。对应的实现入口是bokeh.io的输出切换函数当前源码中仍保留双通道output_notebook()见 src/bokeh/io/output.py接受resources、verbose等参数切换为 Notebook 内嵌渲染模式服务器应用的输出状态管理见 src/bokeh/io/state.py 中的output_notebook(notebook_typejupyter)即curdoc()上下文下的 Notebook 集成状态。这套机制的落地价值在于开发者可以在 Notebook 里以接近bokeh serve的方式运行应用代码事件回调、curdoc()均可用而无需手动起服务器再开浏览器查看。发布说明同时指出该能力是Themes now work with components and in Jupyter notebooks的前置条件——主题样式需要能进入 Notebook 文档才能生效。核心能力三--host参数退场--address登台0.12.5 之前的bokeh serve提供--host参数但由于它只影响生成的访问 URL、并不控制服务器实际监听地址行为令人困惑。此版本将其移除issue #5692职责被更清晰的参数取代。当前仓库 src/bokeh/command/subcommands/serve.py 中的参数定义印证了最终形态--port控制监听端口缺省为DEFAULT_SERVER_PORT传0可让系统分配随机端口实际端口会在启动日志中打印--address第 468 行附近控制服务器实际绑定的 IP 地址这才是替代--host的监听地址参数--unix-socket支持 Unix socket 监听Tornado 能力BOKEH_ALLOW_WS_ORIGIN环境变量控制允许通过 WebSocket 连接的跨域来源以逗号分隔主机名列表。该模块文档还记录了一个平台限制受 Tornado 自身约束Windows 上不支持 IPv6 监听。迁移建议是明确的——旧脚本中的--host一律替换为--address例如bokeh serve app_script.py --port 8080 --address 0.0.0.0核心能力四交互式图例控制图元可见性0.12.5 让图例Legend真正可交互点击图例项可以隐藏/显示对应的 glyphissues #2274、#3715。从当前源码结构看这一能力的三个支柱都保留了下来图例点击事件src/bokeh/events.py 中的LegendItemClick携带被点击的Legend模型与具体LegendItem可挂js_on_event/on_event回调做二次联动图例项可见性状态LegendItem模型的visible属性由前端点击自动切换与 glyph 渲染状态同步图例点击行为定制图例模型支持click_policy等选项如隐藏或选中两种行为。当前仓库提供了三类交互示例可作对照阅读examples/interaction/legends/legend_click.py点击隐藏、examples/interaction/legends/legend_hide.py、examples/interaction/legends/legend_mute.py点击置灰以及 examples/plotting/interactive_legend.py。核心能力五GMapPlot 修复与gmap()便捷函数0.12.5 对 Google Maps 绘图做了一轮集中修复并新增gmap()函数issue #5015 之外的 #2822、#2940、#3737、#4835、#5592、#5826、#5845使创建 Google 地图图形的流程接近普通figure()from bokeh.plotting import gmap from bokeh.models import GMapOptions map_options GMapOptions(map_typehybrid) plot gmap(GOOGLE_API_KEY, map_options) plot.circle(lat..., lon..., size10, line_width3)当前仓库中的实现印证了设计要点见 src/bokeh/plotting/gmap.pygmap(google_api_key, map_options, **kwargs)仅是GMap(api_key..., map_options..., **kwargs)的薄封装GMap继承GMapPlot与GlyphAPI因此在gmap返回的图上可直接使用circle、scatter等 glyph API构造函数自动装配经纬度轴x_axis_location/y_axis_location非空时分别添加带MercatorTicker/MercatorTickFormatterdimensionlon/lat的LinearAxis默认工具集为pan,wheel_zoom,reset,helpAPI key 会以 base64 编码形式存入 Bokeh 文档 JSON因此不应把含 key 的文档随意发布。模型层定义在 src/bokeh/models/map_plots.py抽象基类MapOptions/MapPlot之下是GMapOptions含map_type、zoom、lat、lon、tilt、bearing、styles等属性与GMapPlot。其中lat为必需Float模块通过验证器保证GMapPlot必须提供api_key否则报MISSING_GOOGLE_API_KEY校验错误且范围类型必须兼容地图投影INCOMPATIBLE_MAP_RANGE_TYPE。更上层的地图体系如 ArcGIS同样挂在这一套MapOptions/MapPlot抽象之下可见 0.12.5 的 GMap 修复实际上是整个地图模型族的地基工程。使用前提是申请到 Google Maps JavaScript API key且浏览器端需能访问 Google Maps 服务国内网络环境或无 key 场景下该功能不可用属于该特性的固有限制。核心能力六CustomJSTransform可用于 CDS 列0.12.5 之前CustomJSTransform只能作用于ColumnDataSource的整个列此版本issue #5015支持对列中的元素做行级 JS 变换。当前实现见 src/bokeh/models/transforms.py 的CustomJSTransform(Transform)配合args属性可把额外数据带入 JS 作用域。实战示例仓库中已有现成对照examples/basic/data/transform_customjs.py 演示了用 JS 代码按行改写列值examples/plotting/customjs_expr.py 展示了与 glyph 属性联动用法。典型写法from bokeh.models import CustomJSTransform # 对 data[x] 列逐元素执行 JS 表达式 t CustomJSTransform(codereturn Math.sin(x);) fig.line(x, y, sourcesource, transformxt)从源码结构看Transform是 glyph 数据流的一等公民glyph 属性接受transform参数后渲染管线会先取 CDS 列、再经 JS 变换得到最终绘制值这使 0.12.5 的列级 元素级能力成为后续所有 transform 用法包括 jitter、marker 等的统一底座。核心能力七主题在 components 与 Notebook 中生效此前theme参数在bokeh.embed.components输出和 Notebook 内嵌场景中会被忽略issues #4722、#49520.12.5 修复了这一问题components(..., theme...)与 Notebook 输出路径现在都会把主题样式打包进最终 HTML/JSON。主题定义与合并逻辑位于 src/bokeh/themes/含light_minimal、dark_minimal等内置主题文档与示例可参考 examples/styling/themes/ 与 examples/output/apis/components.py。对多租户嵌入场景把 Bokeh 图表嵌入其他 Web 系统而言这项修复意味着主题隔离第一次在组件级输出中真正成立。社区贡献pivot 示例应用发布说明还特别点名了一个社区贡献的复杂应用示例——pivotissue #5894它展示了 Bokeh 应用在多维数据透视/聚合场景下的组织方式数据模型、布局组合与交互回调如何协同。这类非官方教程式的完整应用代码是理解 Bokeh 应用架构document、session、模型图的良好范本阅读时可结合 examples/server/app/ 下的官方服务器应用对照。总结0.12.5 表面上是一次例行增量更新实际完成了 Bokeh 交互模型的几块关键拼图事件系统让 Python 与 JS 两侧都能响应细粒度交互Notebook 内嵌 主题修复打通了交互式开发到组件嵌入的完整链路gmap()与地图模型修复奠定了地图绘图的 API 形态--address取代--host则是一次典型的 CLI 语义纠偏。这些特性在今天的代码库中均可找到一一对应的落点src/bokeh/events.py、src/bokeh/plotting/gmap.py、src/bokeh/models/map_plots.py、src/bokeh/models/transforms.py、src/bokeh/command/subcommands/serve.py。对于从 0.12 时代代码迁移到新版本的读者本文列出的源码路径可以作为逐项核对行为的基准。【免费下载链接】bokehInteractive Data Visualization in the browser, from Python项目地址: https://gitcode.com/GitHub_Trending/bo/bokeh创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门