Изменить панорамирование DynamicMap с обратным вызовом - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть данные временных рядов, которые я хочу отображать изо дня в день, используя holoviews на сервере bokeh. Мой код сводится к:

import pandas as pd
import numpy as np
import holoviews as hv

hv.extension("bokeh", "matplotlib")
renderer = hv.renderer('bokeh')

df = pd.DataFrame(pd.date_range("2019-11-01", "2019-11-07", freq="H"), columns=["timestamp"])
df["level"] = 17
df = df.set_index("timestamp")
ds = hv.Dataset(df, kdims="timestamp", vdims="level")

days = list(sorted({t.date() for t in df.index}))
pattern_dim = hv.Dimension('Day', values=days)

dmap = hv.DynamicMap(lambda d: ds[d:d + np.timedelta64(1, 'D')].to(hv.Curve), kdims=[pattern_dim])
doc = renderer.server_doc(dmap)

Однако, когда я меняю день с помощью ползунка в bokeh serve ..., мне приходится вручную настраивать панорамирование для просмотра новых данных. Можно ли это сделать с помощью обратного вызова?

Нечто подобное было запрошено для bokeh без holoviews: Вручную изменить диапазон х для графика Боке

1 Ответ

0 голосов
/ 08 ноября 2019

Решение использует DataRange1d

import pandas as pd
import numpy as np
import holoviews as hv
from bokeh.models import DataRange1d
from bokeh.plotting import Figure

hv.extension("bokeh", "matplotlib")
renderer = hv.renderer('bokeh')

df = pd.DataFrame(pd.date_range("2019-11-01", "2019-11-07", freq="H"), columns=["timestamp"])
df["level"] = 17
df = df.set_index("timestamp")
ds = hv.Dataset(df, kdims="timestamp", vdims="level")

days = list(sorted({t.date() for t in df.index}))
pattern_dim = hv.Dimension('Day', values=days)
dmap = hv.DynamicMap(lambda d: ds[d:d + np.timedelta64(1, 'D')].to(hv.Curve), kdims=[pattern_dim])
doc = renderer.server_doc(dmap)
for x in doc.select({'type': Figure}):
    x.x_range = DataRange1d()

Найдено в этом выпуске github: https://github.com/pyviz/holoviews/issues/2441

...