十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

如何用 Bokeh 构建散点图矩阵(SPLOM)并联动多个子图?

如何用 Bokeh 构建散点图矩阵(SPLOM)并联动多个子图? 如何用 Bokeh 构建散点图矩阵SPLOM并联动多个子图【免费下载链接】bokehInteractive Data Visualization in the browser, from Python项目地址: https://gitcode.com/GitHub_Trending/bo/bokehBokeh 的统计图章节把 SPLOMscatter plot matrix散点图矩阵定义为把多个散点图按网格排布用一张图突出数据集各维度之间的相关性而它的两个关键组件正是联动平移linked panning和联动选择linked brushing。这篇文章基于仓库中的官方示例 examples/topics/stats/splom.py演示如何用 Bokeh models 层Plot、Scatter、ColumnDataSource、DataRange1d从零构建一个 N×N 的 SPLOM让任一子图上的平移/缩放动作同步到其他子图、任一处框选高亮同步到所有子图。适用前提是本地已安装可正常运行的 Bokeh并使用其内置的 Palmer penguins 数据集模块位于 src/bokeh/sampledata/penguins.py随包分发无需额外下载数据。前提联动是怎么实现的写代码前先看 Bokeh 文档给出的两条联动机制见 linking.rst联动平移在多个 figure/plot 之间共享 range 对象即可。文档给出的简单示例 examples/interaction/linking/linked_panning.py 中第二张图通过x_ranges1.x_range, y_ranges1.y_range复用第一张图的 range第三张图只共享x_range实现部分联动。联动选择brushing让多个 glyph 渲染器共享同一个数据源data source。Bokeh 据此判断对某个 glyph 做的选择会传递到所有共享该 source 的 glyph。SPLOM 示例就是这两条机制的组合每个子图按列共享 x range、行共享 y range的方式复用DataRange1d实例所有子图共用一个ColumnDataSource并配上LassoSelectTool。构建 SPLOM完整脚本以下脚本与仓库示例 splom.py 一致可直接保存为splom.py运行。数据用的是 Bokeh 内置 penguins 数据集三个数值维度为bill_length_mm、bill_depth_mm、body_mass_kg由body_mass_g / 1000换算得到N 3即生成 3×3 网格from itertools import product from bokeh.io import show from bokeh.layouts import gridplot from bokeh.models import (BasicTicker, ColumnDataSource, DataRange1d, Grid, LassoSelectTool, LinearAxis, PanTool, Plot, ResetTool, Scatter, WheelZoomTool) from bokeh.sampledata.penguins import data from bokeh.transform import factor_cmap df data.copy() df[body_mass_kg] df[body_mass_g] / 1000 SPECIES sorted(df.species.unique()) ATTRS (bill_length_mm, bill_depth_mm, body_mass_kg) N len(ATTRS) source ColumnDataSource(datadf) xdrs [DataRange1d(boundsNone) for _ in range(N)] ydrs [DataRange1d(boundsNone) for _ in range(N)] plots [] for i, (y, x) in enumerate(product(ATTRS, reversed(ATTRS))): p Plot(x_rangexdrs[i%N], y_rangeydrs[i//N], background_fill_color#fafafa, border_fill_colorwhite, width200, height200, min_border5) if i % N 0: # first column p.min_border_left p.min_border 4 p.width 40 yaxis LinearAxis(axis_labely) yaxis.major_label_orientation vertical p.add_layout(yaxis, left) yticker yaxis.ticker else: yticker BasicTicker() p.add_layout(Grid(dimension1, tickeryticker)) if i N*(N-1): # last row p.min_border_bottom p.min_border 40 p.height 40 xaxis LinearAxis(axis_labelx) p.add_layout(xaxis, below) xticker xaxis.ticker else: xticker BasicTicker() p.add_layout(Grid(dimension0, tickerxticker)) scatter Scatter(xx, yy, fill_alpha0.6, size5, line_colorNone, fill_colorfactor_cmap(species, Category10_3, SPECIES)) r p.add_glyph(source, scatter) p.x_range.renderers.append(r) p.y_range.renderers.append(r) # suppress the diagonal if (i%N) (i//N) N-1: r.visible False p.grid.grid_line_color None p.add_tools(PanTool(), WheelZoomTool(), ResetTool(), LassoSelectTool()) plots.append(p) show(gridplot(plots, ncolsN))脚本中承担联动任务的四个关键点共享 range 实现联动平移。xdrs与ydrs各只有 N 个DataRange1d实例子图创建时传入x_rangexdrs[i%N]、y_rangeydrs[i//N]即同一列的子图共用同一个 x range、同一行的子图共用同一个 y range。这正是 linking.rst 所述share range objects在网格场景下的展开。range 跟随数据。p.x_range.renderers.append(r)和p.y_range.renderers.append(r)把每个Scatter渲染器挂到对应 range 的 renderers 上使DataRange1d依据该维度数据确定可视范围。共享 source 实现联动选择。循环内所有p.add_glyph(source, scatter)用的是同一个ColumnDataSource。配合每个子图上的LassoSelectTool()在任一子图框选时选择会传递到所有子图——即文档所说的 linked brushing。抑制对角线。当(i%N) (i//N) N-1本示例布局下的对角位置时将渲染器r.visible False并去掉网格线避免同一维度与自身重复散点。坐标轴布局上只在第一列子图左侧、最后一行子图底部添加带axis_label的LinearAxis其余位置使用BasicTicker生成无标签网格线第一列子图额外加宽 40 像素p.width 40、最后一行加高 40 像素给标签留出空间。颜色由factor_cmap(species, Category10_3, SPECIES)按物种映射用于在联动时区分不同类别的点。运行与验证执行脚本python splom.pyshow(gridplot(plots, ncolsN))会按show的默认输出方式在浏览器中渲染该布局。验证时对照文档描述的两个联动行为在任一子图上拖动平移PanTool或滚轮缩放WheelZoomTool观察共享了同一 range 的其余子图是否同步移动/缩放——对应文档中 linked panning 的效果点击ResetTool可复位。用LassoSelectTool在任一子图圈选一部分点观察共享该ColumnDataSource的其他子图中同批点是否被高亮——对应文档中 linked brushing 的效果。若只想先确认共享 range 即联动这一最小机制可以先跑更简单的 linked_panning.py它只有三个 figures2共享s1的 x/y range、s3只共享 x range能直接看出共享哪一个 range 就联动哪一个维度。边界与说明脚本按 models 层 APIPlotadd_glyph编写而非figure高层接口这是 SPLOM 示例的既有写法因为需要对每个子图的 range、ticker、工具做逐项控制。维度集合由ATTRS决定换成其他数值列即可扩展网格规模脚本中N len(ATTRS)与所有循环索引i%N、i//N都随之自适应penguins 数据集中species用于着色换成自己的数据时需相应调整factor_cmap的分类列。本文所有联动行为均以 linking.rst 的机制描述和 splom.py 示例代码为准更多 SPLOM 相关背景见统计图章节 stats.rst 中的 SPLOM 小节。【免费下载链接】bokehInteractive Data Visualization in the browser, from Python项目地址: https://gitcode.com/GitHub_Trending/bo/bokeh创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表