Как использовать индекс выбранных данных из одного рисунка, чтобы построить что-то на другом рисунке?

У меня есть точечная диаграмма на одной фигуре. Я хотел бы иметь возможность выбрать, возможно, несколько точек данных на упомянутом графике рассеяния и построить (возможно) многострочную диаграмму временных рядов на другом рисунке на основе индексов выбранных данных.

Псевдокод:

data = { x: [1,2,3], y: [1,2,3], time_series: [[1,2,3],[4,5,6],[7,8,9]] }
figure1 = scatter_plot(x, y, select_enabled=True)
figure2 = multi_line_timeseries(figure1.indexes_of_selected_points)
show([figure1, figure2])

Таким образом, если на рисунке 1 выбрана точка данных [1,1] (индекс 0), то на рисунке 2 отображается временной ряд [1,2,3] (индекс 0). Если выбрано несколько точек, то отображается несколько временных рядов.

Ограничение заключается в том, что библиотеку HoloViews нельзя использовать из-за того, что она не поддерживает мою платформу.

Как этого добиться?


person Dominykas Mostauskis    schedule 11.07.2018    source источник
comment
Не могли бы вы пояснить, почему нельзя использовать HoloViews? Насколько я знаю, HoloViews должны поддерживаться на всех платформах.   -  person philippjfr    schedule 12.07.2018
comment
@philippjfr, HoloViews дает сбой при импорте в ARM с ошибкой LLVM, которая говорит о том, что не удалось разрешить внешнюю функцию __aeabi_unwind_cpp_pr0. Вот связанная тема, касающаяся fastparquet и numba: github.com/dask/dask/issues/3508< /а>   -  person Dominykas Mostauskis    schedule 12.07.2018
comment
Вы можете попробовать удалить шейдер данных и повторить попытку на ARM? У меня нет платформы ARM, на которой я мог бы это проверить.   -  person James A. Bednar    schedule 12.07.2018
comment
Шейдер данных @JamesA.Bednar не установлен. В связанной ветке кто-то сообщил, что у них не было этой проблемы на их устройстве ARM. Я не уверен, что может быть причиной этого.   -  person Dominykas Mostauskis    schedule 12.07.2018
comment
Странный. Если в вашей системе установлен fastparquet, попробуйте его удалить. HoloViews не имеет никакого системного кода и не использует LLVM напрямую, поэтому не должно возникать проблем с ним.   -  person James A. Bednar    schedule 13.07.2018
comment
@JamesA.Bednar, ха! Удаление fastparquet помогло. Спасибо, никогда бы не догадался о связи.   -  person Dominykas Mostauskis    schedule 14.07.2018


Ответы (1)


Примечание. Я решил не поддерживать одновременное построение нескольких временных рядов, хотя это было бы тривиальным расширением этого.

Чтобы использовать индекс выбранной точки данных для определения того, что должно быть отображено на другом рисунке, вам необходимо:

  • put the relevant data (i.e. x,y,timeseries in the example) on one or multiple ColumnDataSources;
    • I put the data to select and data that will be updated on different cds's, because I fear it might create a callback loop, though I've not tested this.
  • создайте ColumnDataSource, который будет служить источником для второго рисунка, отображающего временные ряды;
  • включить инструмент выделения, например TapTool ('tap');
  • добавить обратный вызов CustomJS к ColumnDataSource, содержащему выбираемые точки данных;
  • параметризуйте этот обратный вызов с помощью ColumnDataSource, содержащего данные временных рядов;
  • иметь индексы обратного вызова для выбранных точек данных;
  • пусть обратный вызов внесет необходимые изменения во вторую фигуру ColumnDataSource;
  • вызовите cds_of_2nd_figure.change.emit() перед возвратом из обратного вызова.

Код для иллюстрации:

cds = ColumnDataSource(data=dict(x=x,y=y,timeseries=timeseries))
cds2 = ColumnDataSource(x_to_plot=[],u_to_plot=[])

def selection_callback(d=cds,d2=cds2):
    last_selected_ix = cb_obj.selected.indices[0]
    timeserie = d.data['timeseries'][last_selected_ix]
    x_to_plot = timeserie['x']
    y_to_plot = timeserie['y']
    d2.data['x_to_plot'] = x_to_plot
    d2.data['y_to_plot'] = y_to_plot
    d2.changes.emit()

# turn above function to js
selection_callback = CustomJS.from_py_func( selection_callback )

cds.callback = selection_callback

Когда какая-либо фигура выбирает данные из cds, временная серия timeseries[ix] будет нанесена на фигуру(ы), которые строят cds2, где ix — это индекс последней выбранной точки данных из cds.

Релевантный ресурс, на котором есть вся актуальная информация:

https://docs.bokeh.org/en/latest/docs/user_guide/interaction/callbacks.html#customjs-for-tools

person Dominykas Mostauskis    schedule 12.07.2018