Как использовать инструмент для наведения Bokeh для цикла с виджетом флажка - PullRequest
0 голосов
/ 08 мая 2018

Python 3,6

Боке 12,15

Я попытался реализовать пример с боке line_on_off.py , нов цикле for с парящим инструментом и данными различной длины.Однако происходит то, что, когда линия выключена, она отключает всплывающую подсказку любой линии, созданной после нее.Например, если я отключаю строку 1, подсказки строки 2,3,4 отключены, или если я отключаю строку 3, подсказка строки 4 отключена.

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

Код

from bokeh.plotting import figure
from bokeh.models import CheckboxGroup, CustomJS
from bokeh.models import ColumnDataSource
import pandas as pd
from bokeh.models import HoverTool

def create_plot(df_list):
    p = figure(x_axis_type = 'datetime')
    glyph_dict = {}
    labels = []
    active = []
    items = []
    names = 'abcdefghijklmnopqrstuvwxyz'
    callback_string = '{}.visible = {} in checkbox.active;'
    code_string = ''
    i = 0
    sources = []
    for df in df_list:
        legend = df.columns[0]
        series = df.iloc[:,0]
        labels.append(legend)
        x = series.index
        y = series.values
        source =ColumnDataSource(data = {'x':x,'y':y, 'date': [str(x) for x in x]})
        sources.append(source)
        line = p.line('x', 'y', source = sources[i])
        items.append((legend, [line]))
        name = names[i]
        line.name = name
        code_string += callback_string.format(name, str(i))
        glyph_dict.update({name:line})
        active.append(i)
        i+=1
    hover = HoverTool(tooltips=[('date', '@date'),('y', '@y')])
    p.add_tools(hover)
    checkbox = CheckboxGroup(labels=labels, active=active, width=200)
    glyph_dict.update({'checkbox':checkbox})
    checkbox.callback = CustomJS.from_coffeescript(args=glyph_dict, code=code_string)
    return checkbox, p

Минимальный пример

import numpy as np
from datetime import datetime, timedelta
from bokeh.layouts import row
from bokeh.plotting import show


df_list = []
start = datetime(2017, 4,1)
end = datetime(2017,5,1)
for i in range(1,5):
    date = pd.date_range(start, end, freq = '1w')
    shape = len(date)
    df = pd.DataFrame(index = date, data = np.random.randn(shape,1))
    name = 'df'+ str(i)
    df.columns = [name]
    end = end + timedelta(weeks = 1)
    df_list.append(df)


c,p = create_plot(df_list)
r=row([c,p])

show(r)

1 Ответ

0 голосов
/ 08 мая 2018

В подобной ситуации вам, вероятно, следует создать новый отдельный инструмент для наведения мыши для каждой линии, ограничив свойство renderers каждого инструмента для наведения. Итак, что касается вашего кода, переместите создание инструмента наведения внутри цикла и установите его renderers каждый раз:

line = p.line('x', 'y', source = sources[i])
hover = HoverTool(tooltips=[('date', '@date'),('y', '@y')]
                  renderers=[line])
p.add_tools(hover)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...