Bokeh Hexbin:如何获取每个六边形对应的原始数据索引?
获取Bokeh 0.12.15 Hexbin图中每个六边形的原始数据索引
嘿,我来帮你搞定这个问题!在Bokeh 0.12.15里,内置的hexbin方法确实不会直接返回每个六边形对应的原始数据索引,但我们可以手动计算每个点所属的六边形网格坐标,再把原始索引和这些坐标关联起来,就能轻松获取每个六边形对应的索引列表了。
具体实现步骤
- 步骤1:计算每个数据点的六边形网格坐标
Bokeh的hexbin使用轴向坐标系统(q, r),我们可以用numpy实现和Bokeh一致的坐标计算逻辑,确保每个点的分组和生成的六边形完全匹配。 - 步骤2:按六边形坐标分组收集原始索引
把每个点的(q, r)作为唯一标识,将对应的原始数据索引收集到列表中,形成“六边形坐标: 索引列表”的映射。 - 步骤3:将索引列表关联到Hexbin的数据源
生成hexbin图后,把整理好的索引列表添加到hexbin的数据源里,不管是hover显示还是后续提取都能直接调用。
修改后的示例代码
import numpy as np from bokeh.io import output_file, show from bokeh.models import HoverTool from bokeh.plotting import figure from collections import defaultdict n = 500 x = 2 + 2*np.random.standard_normal(n) y = 2 + 2*np.random.standard_normal(n) # 保存所有数据点的原始索引 indices = np.arange(n) # ---------------------- # 计算每个点对应的六边形网格坐标(q, r) # 注意size要和后续hexbin方法的size参数保持一致 # ---------------------- hex_size = 0.5 q = np.floor((x / hex_size) * np.sqrt(3)/2 + y / hex_size * 0.5).astype(int) r = np.floor(y / hex_size * 1.5).astype(int) # 按(q, r)分组,收集每个六边形对应的原始索引 bin_indices_map = defaultdict(list) for idx, point_q, point_r in zip(indices, q, r): bin_indices_map[(point_q, point_r)].append(idx) # 创建绘图对象并生成hexbin p = figure(title="Hexbin for 500 points", match_aspect=True, tools="wheel_zoom,reset", background_fill_color='#440154') p.grid.visible = False # 生成hexbin并获取其数据源 hex_renderer = p.hexbin(x, y, size=hex_size, hover_color="pink", hover_alpha=0.8) hex_source = hex_renderer.data_source # 将索引列表添加到hexbin数据源中 hex_source.data['original_indices'] = [ bin_indices_map.get((q_val, r_val), []) for q_val, r_val in zip(hex_source.data['q'], hex_source.data['r']) ] # 添加HoverTool,鼠标悬停时显示六边形的索引列表 hover = HoverTool(tooltips=[ ("数据量", "@count"), ("原始索引", "@original_indices") ], renderers=[hex_renderer]) p.add_tools(hover) output_file("hexbin_with_indices.html") show(p)
关键说明
- 手动计算的
q和r坐标必须和hexbin方法的size参数一致,否则分组会和Bokeh生成的六边形不匹配。 - 通过
hex_source.data['original_indices']可以直接提取所有六边形对应的原始索引列表,方便后续分析使用。
内容的提问来源于stack exchange,提问作者Miri Ostrovsky
相关产品推荐
相关产品推荐

