2017-10-20 5 views
0

Il est en quelque sorte un exemple complexe, mais je désespérément obtenir de l'aide ...push_notebook ne met pas à jour l'espoir tableau bokeh

J'utilise jupyter-notebook 5.2.0, bokeh version est 0.12.9 et ipywidgets est 7.0.1.

Voici mon DataFrame df:

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

Maintenant, nous allons créer un terrain de bar, en utilisant également l'outil de vol stationnaire:

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) 

enter image description here

J'utilise un ipywidgets.widgets.SelectionRangeSlider à sel ect une plage de dates:

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) 

enter image description here

Le problème est, je ne peux pas obtenir une mise à jour graphique du widget:

x.data_source = ColumnDataSource(update_source(df, myslider.value[0].date(), myslider.value[1].date())) 
push_notebook(handle=h) 

, il fait au moins quelque chose avec l'intrigue, comme hover ne fonctionne plus ...

Qu'est-ce que je manque? Ou est-ce un bug?

Merci pour toute aide

Markus

+0

Vous devriez essayer de garder vos CDS existants un changement de la propriété '.data' de celui-ci, ne pas remplacer les CDS tous ensemble. C'est un modèle d'utilisation beaucoup plus exercé. – bigreddot

+0

Ok, j'essaie 'newdf = update_source (df, myslider.value [0] .date(), myslider.value [1] .date())' et 'x.data_source.data [ "ind"] = newdf. ind' et '' donne un BokehUserWarning': 'colonnes de ColumnDataSource doivent être de la même length.' et l'intrigue ne met pas à jour ni. Je pense que le problème de base est que les indices de vbar doivent devenir moins nombreux ... Y at-il un exemple de travail? – Markus

+0

'BokehUserWarning' n'est pas soulevée, si vous le faites' x.data_source = ColumnDataSource (newdf) '. L'intrigue est mise à jour correctement si vous ajoutez en plus 'fig.x_range.factors = newdf.ind' et' push_notebook (handle = h) '. Mais le vol stationnaire ne fonctionne pas. Une idée de comment obtenir un vol stationnaire? – Markus

Répondre

0

compris comment le faire en utilisant bokeh: https://github.com/bokeh/bokeh/issues/7082, mais malheureusement il ne fonctionne que parfois ...

utiliser au mieux CDSViewer.

+0

Je pense que vous pouvez frapper un problème de savoir en cours https://github.com/bokeh/bokeh/issues/7083 – bigreddot