1

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

伪代码:

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),则[1,2,3]在图 2 上绘制时间序列(索引 0)。如果选择了多个点,则绘制多个时间序列。

一个限制是 HoloViews 库不能使用,因为它不支持我的平台。

如何做到这一点?

4

1 回答 1

0

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

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

  • 将相关数据(即x,y,timeseries示例中)放在一个或多个ColumnDataSources上;
    • 我将要选择的数据和将在不同 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

当某个图从 中选择数据时cdstimeseries[ix]时间序列将绘制在该图上cds2,其中ix是最后选择的数据点的索引cds

具有所有相关信息的相关资源:

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

于 2018-07-12T22:40:25.833 回答