push_notebook不会更新散景图

时间:2017-10-20 16:56:11

标签: bokeh ipywidgets

这是一个复杂的例子,但我非常希望得到帮助......

我正在使用marko-expressjupyter-notebook 5.2.0版本为bokeh0.12.9ipywidgets

这是我的7.0.1

DataFrame df

enter image description here

现在,让我们使用悬停工具创建条形图:

import numpy as np
import pandas as pd
import datetime
import string

start = int(datetime.datetime(2017,1,1).strftime("%s"))
end = int(datetime.datetime(2017,12,31).strftime("%s"))

# set parameters of DataFrame df for simualtion
size, numcats = 100,10

rints = np.random.randint(start, end + 1, size = size)
df = pd.DataFrame(rints, columns = ['zeit'])
df["bytes"] = np.random.randint(5,20,size=size)
df["attr1"] = np.random.randint(5,100,size=size)
df["ind"] = ["{}{}".format(i,j) for i in string.ascii_uppercase for j in string.ascii_uppercase][:len(df)]

choices = list(string.ascii_uppercase)[:numcats]
df['who']= np.random.choice(choices, len(df))
df["zeit"] = pd.to_datetime(df["zeit"], unit='s')
df.zeit = df.zeit.dt.date

df.sort_values('zeit', inplace = True)
df = df.reset_index(drop=True)
df.head(3)

enter image description here

我正在使用from bokeh.io import show, output_notebook, push_notebook from bokeh.models import ColumnDataSource, HoverTool from bokeh.plotting import figure import ipywidgets as widgets output_notebook() # setup figure hover = HoverTool(tooltips=[ ("index", "$index"), ("ind", "@ind"), ("who", "@who"), ("bytes", "@bytes"), ("attr1", "@attr1"), ]) fig = figure(x_range=list(df.ind), plot_height=250, title="Test Bars", toolbar_location=None, tools=[hover]) x = fig.vbar(x="ind", top="bytes", width=0.9, source=ColumnDataSource(df)) h=show(fig, notebook_handle=True) 来选择一系列日期:

ipywidgets.widgets.SelectionRangeSlider

enter image description here

问题是,我无法从小部件获取图表的更新:

import ipywidgets as widgets

# create slider
dates = list(pd.date_range(df.zeit.min(), df.zeit.max(), freq='D'))
options = [(i.strftime('%d.%m.%Y'), i) for i in dates]
index = (0, len(dates)-1)
myslider = widgets.SelectionRangeSlider(
    options = options,
    index = index,
    description = 'Test',
    orientation = 'horizontal',
    layout={'width': '500px'}
)

def update_source(df, start, end):
    x = df[(df.zeit >= start) & (df.zeit < end)]
    #data = pd.DataFrame(x.groupby('who')['bytes'].sum())
    #data.sort_values(by="bytes", inplace=True)
    #data.reset_index(inplace=True)
    #return data
    return x

def gui(model, bars):
    def myupdate(control1):
        start = control1[0].date()
        end = control1[1].date()
        #display(update_source(model, start, end).head(4))
        data = update_source(model, start, end)
    return myupdate

widgets.interactive(gui(df, x), control1 = myslider)

至少,它与情节有关,因为x.data_source = ColumnDataSource(update_source(df, myslider.value[0].date(), myslider.value[1].date())) push_notebook(handle=h) 不再起作用了......

我错过了什么?或者这是一个错误吗?

感谢您的帮助

马库斯

1 个答案:

答案 0 :(得分:0)

想出如何使用散景:https://github.com/bokeh/bokeh/issues/7082来做到这一点,但遗憾的是它只在某些情况下有效...

最好使用CDSViewer