При наведении курсора на легенду будут скрыты все строки, кроме соответствующей - PullRequest
0 голосов
/ 10 февраля 2020

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

import bokeh.palettes as bp
from bokeh.plotting import figure, output_file, show, ColumnDataSource
from bokeh.models import LinearAxis, Range1d, NumeralTickFormatter, Legend
from bokeh.layouts import column
import numpy as np


if __name__ == '__main__':
    num = 5
    color_list2 = bp.magma(num)
    color_list1 = bp.viridis(num)
    plotTools = 'box_zoom, wheel_zoom, pan, tap, crosshair, hover, reset, save'
    p = figure(plot_width=800, plot_height=400, x_range=(0, 1000), y_range=(-2.5, -1.5),
               tools=plotTools, toolbar_location='right', active_scroll='wheel_zoom', )
    p.title.text = 'Hover and Hide'
    items_c1 = []
    i = 0
    pictures = []
    labels = ['a', 'b', 'c', 'd', 'e']
    for label in labels:
        n = np.random.randint(low=3, high=6)
        xs = np.random.random(n) * 1000
        y1s = np.random.random(n) - 2.5
        temp_line = p.line(xs, y1s, line_width=2, color=color_list1[i % num],
                           alpha=0.3, hover_color='red', hover_alpha=0.9)  # , legend_label=label
        items_c1.append((label + '_BER', [temp_line]))
        i = i + 1
        if i % num == 0:
            legend_1 = Legend(items=items_c1)
            p.add_layout(legend_1, 'left')
            p.xaxis.axis_label = 'run_time'
            p.yaxis[0].axis_label = 'BER'
            p.legend[0].orientation = 'vertical'
            p.legend[0].location = 'bottom_center'
            p.legend[0].click_policy = 'hide'
            pictures.append(p)

            p = figure(plot_width=800, plot_height=400, x_range=(0, 1000), y_range=(-2.5, -1.5),
                       tools=plotTools, toolbar_location='right', active_scroll='wheel_zoom', )
            items_c1 = []
    file = "test_ask_5"
    file_path = file + '.html'
    output_file(file_path)
    show(column(pictures))

1 Ответ

0 голосов
/ 20 февраля 2020

Приведенное ниже решение скрывает все строки, кроме той, по которой щелкают (не наводят). Этот код работает для Bokeh v1.3.4

import numpy as np
from bokeh.plotting import figure, show
from bokeh.models import CustomJS

colors = ['orange', 'cyan', 'lightgreen']

p = figure()
lines = [p.line(np.arange(10), np.random.random(10), line_color = colors[i], line_width = 3, legend=colors[i], name=colors[i]) for i in range(3)]

code = '''if(Bokeh != 'undefined' && (Bokeh.active_line === 'undefined' || Bokeh.active_line == null)) 
          { 
              Bokeh.active_line = cb_obj.name; 
          }'''
[line.js_on_change('visible', CustomJS(code = code)) for line in lines]

code = ''' for(i = 0; i < lines.length; i++) {
                if (lines[i].name == Bokeh.active_line) {
                    lines[i].visible = true
                }
                else {
                    lines[i].visible = false
                }
            } 
            Bokeh.active_line = null'''
p.js_on_event('tap', CustomJS(args = {'lines' : lines}, code = code))

code = '''  for(i = 0; i < lines.length; i++) {
                lines[i].visible = true
            } 
            Bokeh.active_line = null'''
p.js_on_event('reset', CustomJS(args = dict(lines = lines), code = code))

p.legend.click_policy = 'hide'

show(p)

Первый обратный вызов применяется ко всем средствам визуализации глифов (линиям) и запускается, когда строка должна быть скрыта, то есть когда пользователь щелкает элемент легенды. Обратный вызов просто устанавливает глобальную переменную Bokeh.active_line, которая запоминает имя средства визуализации (строки), например, «оранжевый» или «голубой»

Второй обратный вызов прикрепляется к холсту графика и запускается каждый раз, когда пользователь щелкает где угодно на участке. Что в основном делает, так это инвертирует видимость глифов (линий). Он показывает только строку, указанную Bokeh.active_line

Третий обратный вызов прикрепляется к графику и запускается, когда пользователь нажимает на инструмент сброса на панели инструментов. Восстанавливает видимость всех линий.

enter image description here

...