如何使用从一个图中选择的数据的索引,在另一个图中绘制一些东西?

How to use the index of selected data from one figure, to plot something in another figure?

我有一张图的散点图。我希望能够 select 在提到的散点图上可能有多个数据点,并根据 select 的索引在另一个图上绘制(可能)多线时间序列图编辑数据。

伪代码:

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] 数据点(索引 0)在图 1 上 select 编辑,则 [1,2,3] 时间序列(索引 0)绘制在图 2 上。如果多个selected,然后绘制多个时间序列。

限制是无法使用 HoloViews 库,因为它不支持我的平台。

如何实现?

注意:我选择不支持同时绘制多个时间序列,尽管这只是对此的一个微不足道的扩展。

要使用 selected 数据点的索引来确定要在另一个图中绘制的内容,您需要:

  • 将相关数据(即示例中的x,y,timeseries)放在一个或多个ColumnDataSource上;
    • 我把数据放到 select 和将在不同 CD 上更新的数据,因为我担心它可能会创建一个回调循环,虽然我没有测试过这个。
  • 创建一个 ColumnDataSource,它将作为绘制时间序列的第二个图形的来源;
  • 启用 selection 工具,例如 TapTool ('tap');
  • 向保存 select 可用数据点的 ColumnDataSource 添加一个 CustomJS 回调;
  • 使用保存时间序列数据的 ColumnDataSource 对该回调进行参数化;
  • 具有 selected 数据点的回调访问索引;
  • 让回调对第二个数字的 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 的某些数字 selects 数据时,timeseries[ix] 时间序列将绘制在绘制 cds2 的 figure/s 上,其中 ix 是来自 cds.

的最后一个 selected 数据点的索引

包含所有相关信息的相关资源:

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