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

问题描述 投票:1回答: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),则在图2上绘制了[1,2,3]时间序列(索引0)。如果选择了多个点,则将绘制多个时间序列。

限制是由于HoloViews库不支持我的平台,因此无法使用。

如何实现?

visualization data-visualization bokeh bokehjs
1个回答
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://docs.bokeh.org/en/latest/docs/user_guide/interaction/callbacks.html#customjs-for-tools

© www.soinside.com 2019 - 2024. All rights reserved.