Filter 根据RangeTool中的Datetime筛选CDSView

Filter 根据RangeTool中的Datetime筛选CDSView,filter,bokeh,date-range,interaction,Filter,Bokeh,Date Range,Interaction,我试图根据另一个图中的rangetool控制的日期范围过滤散点图(p1)的数据 这将是此处已显示内容的一个变体: 这里是MWE(不适用于p1): 我想使用“RangeTool(x_range=p.x_range)”来控制p1源的过滤器。任何帮助都将不胜感激以下是一个示例: import numpy as np from bokeh.layouts import column from bokeh.models import ColumnDataSource, RangeTool, Custo

我试图根据另一个图中的rangetool控制的日期范围过滤散点图(p1)的数据

这将是此处已显示内容的一个变体:

这里是MWE(不适用于p1):

我想使用“RangeTool(x_range=p.x_range)”来控制p1源的过滤器。任何帮助都将不胜感激

以下是一个示例:

import numpy as np

from bokeh.layouts import column
from bokeh.models import ColumnDataSource, RangeTool, CustomJS, CDSView, CustomJSFilter
from bokeh.plotting import figure, show
from bokeh.sampledata.stocks import AAPL

dates = np.array(AAPL['date'], dtype=np.datetime64)
source = ColumnDataSource(data=dict(date=dates, close=AAPL['adj_close'], volume=AAPL['volume']))

p = figure(plot_height=300, x_axis_type="datetime", x_range=(dates[1500], dates[2500]))

p.line('date', 'close', source=source)

range_tool = RangeTool(x_range=p.x_range)

p.x_range.callback = CustomJS(args=dict(source=source), code="source.change.emit();")

date_filter = CustomJSFilter(args=dict(source=source, x_range=p.x_range), code="""
let start=x_range.start;
let end=x_range.end;
let dates = source.data['date'];
let indices = [];
for (var i = 0; i <= dates.length; i++){
    if (dates[i] >= start && dates[i] <= end) indices.push(i);
}
return indices;
""")

view = CDSView(source=source, filters=[date_filter])

p1 = figure(plot_height=300)
p1.circle (x='close', y='volume', source=source, view=view)

select = figure(plot_height=130, x_axis_type="datetime")

select.line('date', 'close', source=source)
select.add_tools(range_tool)

show(column(p, p1, select))
将numpy导入为np
从bokeh.layouts导入列
从bokeh.models导入ColumnDataSource、RangeTool、CustomJS、CDSView、CustomJSFilter
从bokeh.plotting导入图形,显示
从bokeh.sampledata.stocks导入AAPL
dates=np.array(AAPL['date'],dtype=np.datetime64)
source=ColumnDataSource(data=dict(日期=dates,close=AAPL['adj_close'],volume=AAPL['volume']))
p=图形(绘图高度=300,x轴类型=“日期时间”,x范围=(日期[1500],日期[2500]))
p、 行('date','close',source=source)
范围工具=范围工具(x范围=p.x范围)
p、 x_range.callback=CustomJS(args=dict(source=source),code=“source.change.emit()”)
date\u filter=CustomJSFilter(args=dict(source=source,x\u range=p.x\u range),code=“”
让开始=x_range.start;
设end=x_range.end;
让dates=source.data['date'];
设指数=[];
对于(变量i=0;i=开始日期和日期[i]
import numpy as np

from bokeh.layouts import column
from bokeh.models import ColumnDataSource, RangeTool, CustomJS, CDSView, CustomJSFilter
from bokeh.plotting import figure, show
from bokeh.sampledata.stocks import AAPL

dates = np.array(AAPL['date'], dtype=np.datetime64)
source = ColumnDataSource(data=dict(date=dates, close=AAPL['adj_close'], volume=AAPL['volume']))

p = figure(plot_height=300, x_axis_type="datetime", x_range=(dates[1500], dates[2500]))

p.line('date', 'close', source=source)

range_tool = RangeTool(x_range=p.x_range)

p.x_range.callback = CustomJS(args=dict(source=source), code="source.change.emit();")

date_filter = CustomJSFilter(args=dict(source=source, x_range=p.x_range), code="""
let start=x_range.start;
let end=x_range.end;
let dates = source.data['date'];
let indices = [];
for (var i = 0; i <= dates.length; i++){
    if (dates[i] >= start && dates[i] <= end) indices.push(i);
}
return indices;
""")

view = CDSView(source=source, filters=[date_filter])

p1 = figure(plot_height=300)
p1.circle (x='close', y='volume', source=source, view=view)

select = figure(plot_height=130, x_axis_type="datetime")

select.line('date', 'close', source=source)
select.add_tools(range_tool)

show(column(p, p1, select))