切换DataFile后Bokeh图表未更新问题求助
问题原因及解决方法
你的问题出在回调里只是切换了局部变量source,但图表绑定的始终是最初的source1,并没有实际更新图表使用的数据源数据。虽然控制台能看到source2的数据,但图表根本没用到这个新的数据源对象。
修复后的代码
import numpy as np import pandas as pd from bokeh.plotting import figure, show from bokeh.models import ColumnDataSource, HoverTool, CustomJS from bokeh.models.widgets import RadioGroup from bokeh.layouts import row def main(): df1 = pd.DataFrame(data={'ABC1': [1, 2, 3, 4, 5, 6], 'ABC2': [10, 20, 30, 40, 50, 60], 'score': [100, 200, 300, 400, 500, 600]}) source1 = ColumnDataSource(df1) df2 = pd.DataFrame(data={'ABC1': [11, 12, 13, 14, 15, 16], 'ABC2': [10, 20, 30, 40, 50, 60], 'score': [100, 200, 300, 400, 500, 600]}) source2 = ColumnDataSource(df2) # 定义一个主数据源,绑定给图表 source = ColumnDataSource(df1) p = figure(title='ABC Visualization', x_axis_label='ABC1', y_axis_label='ABC2', toolbar_location='above') p.scatter("ABC1", "ABC2", source=source) hover = HoverTool(tooltips=[('Cell Name', '@index')], mode='mouse') p.add_tools(hover) radio_group = RadioGroup(labels=['File 1', 'File 2'], active=0) # 修改后的回调:把选中数据源的数据复制到主source中 radio_callback = CustomJS(args=dict(source=source, source1=source1, source2=source2), code=""" console.log('radio_group: active=' + this.active) // 根据选中项获取对应数据源的数据 const new_data = this.active === 0 ? source1.data : source2.data; // 更新主数据源的数据 source.data = new_data; // 触发更新事件 source.change.emit() """) radio_group.js_on_change('active', radio_callback) layout = row(radio_group, p) show(layout) if __name__ == "__main__": main()
关键修改点
- 单独创建一个
source作为图表绑定的主数据源,不再直接赋值为source1 - 回调中不再切换数据源对象,而是把
source1或source2的数据内容复制到主source的data属性里 - 触发
source.change.emit()通知图表更新
这样操作后,点击File2时,图表会读取主数据源更新后的内容,就能正常显示新数据了。
内容的提问来源于stack exchange,提问作者Sandeep Reddy
相关产品推荐
相关产品推荐

