我很难克服以下问题: 我需要可视化bokeh DataTable中的大型数据集(> 1M行,3-5列)。所有数据的检索都是昂贵的(从mongodb花费几分钟-即使已建立索引)。少量数据行的检索非常快(因为对mongodb集合进行了索引)
我决定实施分页=> (1)设置一个具有10行的简短bokeh数据表 (2)当用户选择了最后一行时,更新表以查看下一页(读取后10行)并将选择移到表的第一行。
第一步工作正常。但是,我发现移动选择的实现只是部分成功。高亮显示已更改,但选择未更改,因此用户无法在按下向下箭头或PgDown键的情况下执行移至下一页的操作。谁能帮助我解决选择问题,或建议另一个方法,解决如何通过在bokeh中显示昂贵的全数据检索长表来解决问题?
这是我的测试代码:
from bokeh.plotting import figure, curdoc
from bokeh.models.sources import ColumnDataSource
from bokeh.layouts import row
from bokeh.models.widgets import DataTable, TableColumn
import random
table_rows_count = 10
def get_next_page():
data = list(range(get_next_page.zero_row_position, get_next_page.zero_row_position + table_rows_count))
ret = dict(index=data, x=data, y=data,z = random.sample(range(100), table_rows_count))
get_next_page.zero_row_position += table_rows_count
return ret
get_next_page.zero_row_position = 0
def data_table_selected(attr, old, new):
selected_row = new[0]
print(f'selected row: {selected_row} : {source1.selected.indices}')
if selected_row == table_rows_count-1:
source1.data = get_next_page()
source1.selected.indices = [0]
print(f'after update: selected row: {selected_row} : {source1.selected.indices}')
data = get_next_page()
source1 = ColumnDataSource(data)
fig1 = figure(plot_width=300, plot_height=300)
fig1.circle(x='x', y='y', size=table_rows_count, source=source1)
columns = [
TableColumn(field="y", title="XY"),
TableColumn(field="z", title="Text"),
]
data_table = DataTable(source=source1, columns=columns, width=400, height=280)
data_table.source.selected.on_change('indices', data_table_selected)
curdoc().add_root(row(fig1, data_table))