代码之家  ›  专栏  ›  技术社区  ›  Dominykas Mostauskis

如何使用一个图中所选数据的索引,在另一个图中绘制某些内容?

  •  1
  • Dominykas Mostauskis  · 技术社区  · 6 年前

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

    伪代码:

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

    限制是全息图库不能使用,因为它不支持我的平台。

    如何实现这一目标?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Dominykas Mostauskis    6 年前

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

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

    • 放置相关数据(即 x,y,timeseries 在示例中)在一个或多个 ColumnDataSource S;
      • 我把要选择的数据和将在不同CD上更新的数据放在一起,因为我担心它可能会创建一个回调循环,尽管我没有测试过这个。
    • 创建 列数据源 它将作为绘制时间序列的第二个图形的源;
    • 例如,启用选择工具 TapTool ( 'tap' ;
    • 添加一个 CustomJS 回拨到 列数据源 保存可选择的数据点;
    • 用参数化该回调 列数据源 保存时间序列数据的;
    • 对选定的数据点进行回调访问;
    • 让回调对第二个数字进行必要的更改 列数据源 ;
    • 呼叫 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 , the timeseries[ix] 时间序列将绘制在绘制的图形上。 cds2 ,在哪里 ix 是上一个选定数据点的索引 硫化镉 .

    具有所有相关信息的相关资源: https://bokeh.pydata.org/en/latest/docs/user_guide/interaction/callbacks.html#customjs-for-selections