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

时间:2018-07-11 21:06:40

标签: visualization data-visualization bokeh bokehjs

我在一个图上有一个散点图。我希望能够在上述散点图上选择多个数据点,并根据所选数据的索引在另一幅图上绘制一个(可能)多线时间序列图。

伪代码:

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库由于不支持我的平台而无法使用。

如何实现?

1 个答案:

答案 0 :(得分:0)

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

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

  • 将相关数据(在示例中为x,y,timeseries)放在一个或多个ColumnDataSource上;
    • 我将数据选择并在不同CD上进行更新,因为我担心它可能会创建回调循环,尽管我尚未对此进行测试。
  • 创建一个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://bokeh.pydata.org/en/latest/docs/user_guide/interaction/callbacks.html#customjs-for-selections