Следуя примеру 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, это отсутствует в API RangeTool, так что это невозможно, или я здесь использую неправильный подход?
(PS. Добавление разброса к вторичной фигуре не влияет на RangeTool)
Есть ли способ легко получить такое поведение взаимодействия? Спасибо.