#datatable #bokeh
Вопрос:
Я хотел бы ограничить отображаемые значения в таблице данных на основе выбора в основной таблице.
Что у меня есть до сих пор:
def renderLogTable(self, main_fig, logs): """ renders a table with columns time, description returns the data table to call show(data_table) on it. TODO: filter the table by the time selection above https://stackoverflow.com/questions/57551852/filter-bokeh-datatable-on-plot-selection """ from datetime import date from random import randint from bokeh.models import ColumnDataSource, DataTable, DateFormatter, TableColumn from bokeh.models import CustomJS from bokeh.events import SelectionGeometry data = dict( dates=[li['datetime'] for li in self.logevents], descriptions=[li['description'] for li in self.logevents], ) source = ColumnDataSource(data) source_filtered = ColumnDataSource(data=dict(dates=[], descriptions=[])) columns = [ TableColumn(field="dates", title="Date", formatter=DateFormatter(format="%d.%m/%H:%M"), width=70), TableColumn(field="descriptions", title="Descriptions"), ] data_table = DataTable(source=source_filtered, columns=columns, width=900, height=280) #filter #example from here https://stackoverflow.com/questions/57551852/filter-bokeh-datatable-on-plot-selection main_fig.js_on_event(SelectionGeometry, CustomJS(args=dict(s1=source, s2=source_filtered), code=""" var data = s1.data; var f = cb_obj.indices; /// how to get the selection geometry? var min_datetime=??? var max_datetime=??? var d2 = s2.data; d2['dates']=[] d2['descriptions']=[] for(i = 0; i lt; data.length;i ){ if(data['dates'][i] gt;min_datetime amp;amp; data['dates'][i] lt; max_datetime) { d3['dates'].push(data['dates'][i]) d3['descriptions'].push(data['descriptions'][i]) } s2.change.emit() // trigger change on datatable data_table.change.emit() """)) return data_table
который называется через
main_chart = figure(x_axis_type="datetime", ...) self.renderLogTable(main_chart, self.logs)
Это self.logs
список диктовок {'date', 'description'}
.
Насколько я понимаю, мне нужно получить выбранный диапазон времени внутри JS-обратного вызова и отфильтровать данные для источника данных таблицы. Наверное, вот так?
for(i = 0; i lt; data.length;i ){ if(data['dates'][i] gt;min_datetime amp;amp; data['dates'][i] lt; max_datetime) { d3['dates'].push(data['dates'][i]) d3['descriptions'].push(data['descriptions'][i]) }
Спасибо, что направили меня в правильном направлении!
Пожалуйста, обратите внимание на строку var f = cb_obj.indices; /// how to get the selection geometry?
в приведенном выше коде.