2016-05-08 4 views
1

В настоящее время я изучаю Python и пытаюсь создать интерактивную панель мониторинга, которая работает в браузере. Я использую Bokeh для визуализации и flexx/pyscript для интерактивности обратного вызова. Первой целью является создание кнопки, которая фильтрует набор данных. Я попытался использовать пример слайдера на http://bokeh.pydata.org/en/0.11.1/docs/user_guide/interaction.html, и я изменил его, чтобы просто изменить данные, нажав кнопку (фактическая фильтрация будет шагом 2).Интерактивный участок браузера в Python 3.5 с использованием 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) 

Страница загружается, и я могу щелкнуть по кнопкам, но изменение графика не запускается. Знаете ли вы, как изменить этот код, чтобы он запускал и фактическое изменение с помощью обработчика событий кнопки bokeh? Я искал много сайтов, но я не могу найти хороший пример.

Заранее благодарен!

ответ

1

Вам просто нужно реально обновить данные на источнике данных:

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') 

Вы код просто создает новый вары x и y, а затем сразу же переписывает их. Это фактически не обновляет .data, что и должно произойти.

+0

Спасибо, еще один вопрос. Когда я нажимаю кнопку, значения меняются соответствующим образом, но затем сюжет немедленно сбрасывается. Я только хочу, чтобы это произошло, когда я нажимаю кнопку второй раз. Есть предположения? –

+0

Я не совсем уверен, что вы имеете в виду, вы имеете в виду, что вы не хотите, чтобы обновление данных произошло немедленно? Я думаю, что вы могли бы вызвать обратный вызов для переключения bool взад и вперед и только вызвать триггер на 'true'. Например, 'window.my_callback_flag', но, вероятно, есть идея лучше, чем глобальная на' window'. – bigreddot

+0

Когда я нажимаю, мой график на короткое время показывает новые данные, указанные в обратном вызове, но затем страница перезагружается и сразу показывает исходный график снова. –