如何使用从一个图中选择的数据的索引,在另一个图中绘制一些东西?
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
我有一张图的散点图。我希望能够 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
.
包含所有相关信息的相关资源:
https://docs.bokeh.org/en/latest/docs/user_guide/interaction/callbacks.html#customjs-for-tools