Как отфильтровать данные по дате, используя выделение на основном графике?

#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? в приведенном выше коде.