如何在Bokeh中实时更新hex_tile的fill_color及linear_cmap最大值范围
解决方案
核心逻辑是不要重新创建颜色映射或替换fill_color属性,直接修改已绑定的LinearColorMapper的high参数即可:
- 初始化阶段提取颜色映射器实例单独存储,方便后续修改
- 定时回调中仅更新映射器的最大值参数,无需修改渲染器配置
修正后的可运行代码如下:
from bokeh.models import ColumnDataSource, LinearColorMapper from bokeh.plotting import figure from bokeh.io import curdoc # 初始化数据 data = bin_generate().to_dict(orient='list') init_max = max(bin_generate().counts) # 提前抽取出LinearColorMapper实例,后续直接修改这个对象的参数 color_transform = LinearColorMapper(palette='Viridis256', low=0, high=init_max) fill_color_config = {'field': 'counts', 'transform': color_transform} source = ColumnDataSource(data=data) f = figure(x_range=(-5,5),y_range=(0,6), toolbar_location=None, tools="hover", match_aspect=True, background_fill_color='#440154') # 初始化hex_tile时用提前定义好的颜色配置 f.hex_tile(q="q", r="r",size=0.09, line_color=None, source=source, fill_color=fill_color_config) def update(): new_data = bin_generate().to_dict(orient='list') source.stream(new_data, rollover=50) # 直接修改颜色映射器的high参数即可,不需要重新赋值fill_color color_transform.high = max(bin_generate().counts) curdoc().add_root(f) curdoc().add_periodic_callback(update, 100)
补充说明:
linear_cmap本质是快速生成{field: 字段名, transform: LinearColorMapper实例}的语法糖,你需要操作的是里面的transform对应的映射器实例- Bokeh会自动监听
LinearColorMapper的参数变化,只要修改high属性,页面的颜色映射会自动同步更新,不需要额外调用渲染刷新方法
内容的提问来源于stack exchange,提问作者Abner
相关产品推荐
相关产品推荐

