Bokeh 2.3.0 如何直接获取LinearColorMapper指定值对应的颜色码
方案说明
Bokeh的LinearColorMapper定位是面向前端渲染的序列化组件,本身没有在Python端暴露直接取值的API,但其内部的颜色映射规则是完全确定、可以在Python端直接复现的,不需要额外依赖,只需要按照和Bokeh前端一致的计算逻辑写一个取值函数即可,计算结果和前端实际渲染的颜色100%匹配。
可直接复用的取值函数
def get_mapped_color(color_mapper, input_value): # 读取mapper上已配置的所有参数 palette = color_mapper.palette low = color_mapper.low high = color_mapper.high palette_total = len(palette) # 越界值截断处理,和Bokeh原生逻辑完全一致 clamped_val = max(low, min(high, input_value)) # 计算归一化比例 ratio = (clamped_val - low) / (high - low) # 映射到调色板的整数索引 color_idx = round(ratio * (palette_total - 1)) # 索引边界兜底 color_idx = max(0, min(palette_total - 1, color_idx)) return palette[color_idx]
替换原有调用逻辑
把你示例中无法运行的遍历代码替换成下面的内容,就能拿到每个类别对应的颜色码:
for idx, category_name in enumerate(possible_categories): mapped_color = get_mapped_color(cmap, idx) print(f"Color of Category {category_name}: {mapped_color}")
适配自定义配置的补充说明
- 如果你的
LinearColorMapper配置了low_color、high_color、nan_color特殊属性,只需要在函数开头加上判断:当输入值低于low时直接返回low_color、高于high时直接返回high_color、为非数值时返回nan_color,即可完全对齐前端行为 - 初始化使用内置字符串调色板(比如示例的
Turbo256)时,cmap.palette会自动解析为十六进制颜色值组成的数组,不需要手动导入调色板资源 - 针对你示例中的离散类别映射场景(0-3对应4个分类,mapper的low=0、high=4),计算得到的颜色和绘图中实际渲染的点颜色完全一致,不会出现偏移
内容的提问来源于stack exchange,提问作者Crysers
相关产品推荐
相关产品推荐

