2015-02-23 4 views
2

У меня есть Python Bokeh участок, содержащий несколько строк, Есть ли способ, с помощью которого я могу интерактивно включать и выключать некоторые из этих строк?Выбор символов в Python Bokeh заговоры

p1.line(Time,Temp0,size=12,color=getcolor()) 
p1.line(Time,Temp1,size=12,color=getcolor()) 
p1.line(Time,Temp2,size=12,color=getcolor()) 
p1.line(Time,Temp3,size=12,color=getcolor()) 
.... 
show(p1) 

ответ

1

Я только что наткнулся на this problem myself in a similar scenario. В моем случае я также хотел сделать другие операции над этим.

Есть 2 возможных подходов:

1.) клиент-сервер подход

2.) Клиент только приблизиться к


1.) клиент-сервер подход ак Bokeh Сервер

Одним из способов достижения этой интерактивности является использование сервера bokeh, который вы можете больше узнать о here. Я опишу этот путь более подробно, так как на данный момент я немного более знаком с ним.

Идя ваш пример выше, если бы я использовал боке служить, я бы первым настроить ColumnDataSource так:

source = ColumnDataSource(data = dict(
    time = Time, 
    temp0 = [], 
    temp1 = [], 
    temp2 = [], 
    temp3 = [], 
) 

Далее я бы setup a widget, что позволяет переключать, что температура, чтобы показать:

multi_select = MultiSelect(title="Option:", value=["Temp1"], 
         options=["Temp1", "Temp2", "Temp3"]) 
# Add an event listener on the python side. 
multi_select.on_change('value', lambda attr, old, new: update()) 

Тогда я бы определил функцию обновления, как показано ниже. Целью функции обновления является обновление ColumnDataSource (который был ранее пустым) со значениями, которые вы хотите заполнить на графике.

def update(): 
    """This function will syncronize the server data object with 
     your browser data object. """ 
    # Here I retrieve the value of selected elements from multi-select 
    selection_options = multi_select.options 
    selections = multi_select.value 
    for option in selection_options: 
     if option not in selections: 
      source.data[option] = [] 
     else: 
      # I am assuming your temperatures are in a dataframe. 
      source.data[option] = df[option] 

Последнее, что нужно сделать, это переопределить, как вы строите свои глифы. Вместо того чтобы рисовать из списков или dataframes, мы черпаем наши данные из ColumnDataSource так:

p1.line("time","temp0", source=source, size=12,color=getcolor()) 
p1.line("time","temp1", source=source, size=12,color=getcolor()) 
p1.line("time","temp2", source=source, size=12,color=getcolor()) 
p1.line(Time,Temp3, source=source, size=12,color=getcolor()) 

Так в основном, контролируя содержание ColumnDataSource, который синхронизируется с объектом браузера, я могу переключить ли точки данных показаны или нет. Вам может понадобиться или не обязательно указывать несколько источников ColumnDataSources. Попробуйте это первым.

2.) Клиент только приблизиться к Ak обратных вызовов

подход выше использует архитектуру клиент-сервер. Другим возможным подходом было бы сделать это все в интерфейсе. This link показывает, как некоторые простые взаимодействия могут быть выполнены полностью на стороне браузера с помощью различных форм обратных вызовов.

В любом случае, я надеюсь, что это будет полезно. Ура!

Смежные вопросы