2016-05-08 2 views
1

J'apprends actuellement Python et j'essaie de créer un tableau de bord interactif qui fonctionne sur le navigateur. J'utilise Bokeh pour la visualisation et flexx/pyscript pour l'interactivité de rappel. Le premier objectif est de créer un bouton qui filtre un ensemble de données. J'ai essayé d'utiliser l'exemple de curseur sur http://bokeh.pydata.org/en/0.11.1/docs/user_guide/interaction.html et je l'ai modifié pour simplement changer les données en cliquant sur un bouton (le filtrage réel serait l'étape 2).Tracé de navigateur interactif en Python 3.5 en utilisant bokeh/flexx pyscript

x = [1,2,3] # dummy data 
y = [4,5,6] # dummy data 

# output to static HTML file 
# output_file("sample.html", title="sample") 
source = ColumnDataSource(data=dict(x=x, y=y)) 
# create a new plot with a title and axis labels 
plot = Figure(plot_width=400, plot_height=400) 
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6) 


def callback(source=source): 
    data = source.get('data') 
    f = cb_obj.get('value') 
    x, y = data['x'], data['y'] 
    x = [0.9,0.8,0,7] 
    y = [1,2,3] 
    source.trigger('change') 

button = Button(callback=CustomJS.from_py_func(callback)) 
button.on_click(source) 

layout = vform(button, plot) 

show(layout) 

Les charges de page et je peux cliquer sur les boutons, mais un changement de l'intrigue n'est pas déclenchée. Savez-vous comment modifier ce code afin qu'il se déclenche et change réellement en utilisant un gestionnaire d'événement de bouton bokeh? J'ai cherché de nombreux sites mais je ne trouve pas un bon exemple.

Merci d'avance!

Répondre

1

Il vous suffit de mettre à jour les données réellement sur la source de données:

def callback(source=source): 
    data = source.get('data') 
    f = cb_obj.get('value') 
    data['x'] = [0.9, 0.8, 0,7] 
    data['y'] = [1, 2, 3 ]   
    source.trigger('change') 

code que vous venez de créer nouveau vars x et y puis immédiatement les écrase. Cela ne met pas réellement à jour .data qui est ce qui doit arriver.

+0

Merci, une dernière question. Lorsque j'appuie sur le bouton, les valeurs changent en conséquence, mais le tracé se réinitialise immédiatement. Je veux seulement que cela se produise quand j'appuie sur le bouton une deuxième fois. Des pensées? –

+0

Je ne suis pas sûr de ce que vous voulez dire, vous voulez dire que vous ne voulez pas que la mise à jour des données se fasse immédiatement? Je pense que vous pourriez avoir le callback basculer d'un bool et l'autre, et seulement appeler trigger sur 'true'. Par exemple 'window.my_callback_flag' mais il y a probablement une meilleure idée qu'un global sur' window' – bigreddot

+0

Quand je clique, mon tracé montre brièvement les nouvelles données spécifiées dans le rappel, mais ensuite la page se recharge et montre immédiatement le tracé d'origine à nouveau. –