如何在Jupyter Notebook中更新Bokeh单个圆形样式而无需重绘全部?
如何在Bokeh中无需重绘整个图表更新单个图形样式?
你当前在Jupyter Notebook中用以下代码绘制3个圆形:
fig = figure(plot_width = 300, plot_height = 300) fig.circle(x = [1, 2, 3], y = [3, 7, 5], size = 20, color ="green", alpha = 0.6) show(fig)
修改单个圆形颜色时,你选择重新绘制该圆形并调用show(fig):
fig.circle(x = 2, y = 7, size = 20, color ="blue", alpha = 0.6) show(fig)
但面对大量图形时,这种方式效率很低。可以通过Bokeh的ColumnDataSource实现局部更新,无需重绘整个图表:
解决方案:使用ColumnDataSource管理数据
Bokeh的ColumnDataSource是统一管理图表数据的核心组件,修改数据源后图表会自动同步更新,无需再次调用show()。
具体实现步骤
- 创建
ColumnDataSource,将所有圆形的x、y坐标、颜色、大小等参数存入其中 - 调用
fig.circle()时绑定该数据源 - 修改单个图形样式时,直接更新数据源对应位置的数值,触发数据源变化通知即可
示例代码:
from bokeh.plotting import figure, show, ColumnDataSource from bokeh.io import output_notebook # 初始化Notebook的Bokeh渲染环境 output_notebook() # 构建包含所有圆形参数的数据源 source = ColumnDataSource(data={ 'x': [1, 2, 3], 'y': [3, 7, 5], 'size': [20, 20, 20], 'color': ['green', 'green', 'green'], 'alpha': [0.6, 0.6, 0.6] }) fig = figure(plot_width=300, plot_height=300) # 绑定数据源绘制圆形 fig.circle(x='x', y='y', size='size', color='color', alpha='alpha', source=source) # 首次渲染图表 show(fig) # 修改第二个圆形(索引为1)的颜色 source.data['color'][1] = 'blue' # 触发数据源变化通知,图表会自动刷新 source.change.emit()
额外说明
- 如果是直接替换整个数据列(比如
source.data['color'] = ['green', 'blue', 'green']),无需调用source.change.emit(),Bokeh会自动检测到数据变化 - 除了颜色,x/y坐标、大小、透明度等所有绑定到数据源的属性,都可以用这种方式局部更新
- 在Jupyter Notebook中,只要图表已通过
show()渲染,更新数据源后图表会实时刷新,无需重复调用show()
内容的提问来源于stack exchange,提问作者olivier dadoun
相关产品推荐
相关产品推荐

