You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:06:53