Выбор глифов на графиках 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)

person Paul    schedule 23.02.2015    source источник


Ответы (2)


Я сам столкнулся с этой проблемой в аналогичный сценарий. В моем случае я также хотел сделать другие операции на нем.

Есть 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

Вопрос возник некоторое время назад, но Bokeh теперь имеет функцию интерактивной легенды - вы можете просто указать

your_figure.legend.click_policy = 'hide'

И это делает легенду при перечислении ваших линий интерактивной, и вы можете включать/выключать каждую строку.

person taneljoon    schedule 08.12.2020