Простой Date RangeSlider в Боке 2.0 - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь добавить RangeSlider для дат на график в Bokeh 2.0.

Код выглядит так (данные поступают с кадра данных в pandas):

p = figure(plot_width = 800, plot_height = 350, x_axis_type = "datetime")
p.line(df['date'], df['cases'], color='navy', alpha=0.5, legend_label = "cases", line_width = 2)

Как добавить ползунок для установки и сужения фокуса?

Спасибо и ура,

Ульрих

1 Ответ

0 голосов
/ 26 марта 2020

Несколько замечаний:

  • Это выдаст предупреждение CDSView filters are not compatible with glyphs with connected topology suchs as Line and Patch. Я оставляю на ваше усмотрение решение, является ли это чем-то, что вас волнует
  • Изменение значения ползунка не изменит диапазон данных - я думаю, по той же самой причине, просто потому что использование circle вместо line работает просто отлично
import pandas as pd
from bokeh.io import show
from bokeh.layouts import column
from bokeh.models import ColumnDataSource, BooleanFilter, CDSView, DateRangeSlider, CustomJS
from bokeh.plotting import figure

df = pd.DataFrame(dict(date=['2020-01-01', '2020-01-02', '2020-01-03'], cases=[1, 2, 3]))
df['date'] = pd.to_datetime(df['date'])

p = figure(plot_width=800, plot_height=350, x_axis_type="datetime")

init_value = (df['date'].min(), df['date'].max())
slider = DateRangeSlider(start=init_value[0], end=init_value[1], value=init_value)

ds = ColumnDataSource(df)
date_filter = BooleanFilter(booleans=[True] * df.shape[0])

slider.js_on_change('value', CustomJS(args=dict(f=date_filter, ds=ds),
                                      code="""\
                                          const [start, end] = cb_obj.value;
                                          f.booleans = Array.from(ds.data['date']).map(d => (d >= start && d <= end));
                                          // Needed because of https://github.com/bokeh/bokeh/issues/7273
                                          ds.change.emit();
                                      """))

p.circle('date', 'cases', source=ds, view=CDSView(source=ds, filters=[date_filter]),
         color='navy', alpha=0.5, legend_label="cases", line_width=2)

show(column(p, slider))
...