以下是RangeTool的示例:https://bokeh.pydata.org/en/latest/docs/gallery/range_tool.html,我遇到了一些问题。我想让次要图的范围工具在主图未显示的维度上刷数据(在此示例中为z),并根据次图上的选择对主图中的数据进行刷图。所以我做了以下事情:
import numpy as np
from bokeh.models import ColumnDataSource, RangeTool
from bokeh.layouts import column
from bokeh.plotting import figure, show
n = 10
x = np.random.random(n)
y = np.random.random(n)
z = np.arange(n)
source = ColumnDataSource(data=dict(x=x, y=y, z=z, xy=x+y))
plotxy = figure(plot_width=800, plot_height=800)
plotxy.scatter('x', 'y', source=source)
plotz = figure(plot_width=800, plot_height=100)
plotz.line('z', 'xy', source=source)
range_rool = RangeTool(x_range=plotz.x_range)
plotz.add_tools(range_rool)
p = column([plotxy, plotz])
show(p)
但是,自从我得到以下信息后,RangeTool似乎与这种方法不兼容:
expected an instance of type Range1d, got DataRange1d(id='13429', ...) of type DataRange1d
在下一行:range_rool = RangeTool(x_range=plotz.x_range)
。
将其更改为x_range=Range1d(z[0], z[-1])
可以使所有内容正确显示,但是刷涂对主体图形没有影响。
我可以使用它代替次要人物来获得互动:
plotz = figure(plot_width=800, plot_height=100, tools='xbox_select')
plotz.scatter('t', 'xy', source=source)
plotz.line('t', 'xy', source=source)
这里的问题是BoxSelectionTool不持久且不可拖动,这是我想要的关键功能。
由于在BoxSelectionTool上刷涂效果很好,因此RangeTool API是否缺少此功能,所以这是不可能的,还是我在这里使用了错误的方法? (PS。将散点图添加到辅助图形上对RangeTool无效)
有什么方法可以轻松地实现这种交互行为?谢谢。