Я сам столкнулся с этой проблемой в аналогичный сценарий. В моем случае я также хотел сделать другие операции на нем.
Есть 2 возможных подхода:
1.) Клиент-серверный подход
2.) Подход только к клиенту
1.) Клиент-серверный подход к серверу Bokeh
Один из способов достижения этой интерактивности — использование сервера боке, о котором вы можете узнать подробнее здесь. Я опишу этот способ более подробно, так как на данный момент я немного более знаком с ним.
Следуя приведенному выше примеру, если бы я использовал подачу боке, я бы сначала настроил ColumnDataSource следующим образом:
source = ColumnDataSource(data = dict(
time = Time,
temp0 = [],
temp1 = [],
temp2 = [],
temp3 = [],
)
Затем я бы настроил виджет, который позволяет вам переключать отображаемые температуры:
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]
Последнее, что нужно сделать, это переопределить способ нанесения глифов. Вместо того, чтобы рисовать из списков или фреймов данных, мы будем рисовать наши данные из 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.) Клиент обращается только к обратным вызовам
В приведенном выше подходе используется архитектура клиент-сервер. Другой возможный подход — сделать все это на интерфейсе. Эта ссылка показывает, как некоторые простые взаимодействия могут быть выполнены полностью на стороне браузера с помощью различных форм обратных вызовов.
В любом случае, я надеюсь, что это полезно. Ваше здоровье!
person
Thornhale
schedule
04.03.2017