Bokeh - не показывать всплывающую подсказку, если она имеет недостающее значение - PullRequest
0 голосов
/ 14 апреля 2019

Я работаю над боке, которое показывает активность кластера.Когда пользователь наводит курсор на определенный процессор, я хочу, чтобы он отображал статистику о процессоре.Вот код:

TOOLTIPS = [
    ("Usage", "@{usage}%"),
    ("Name", "@name"),
    ("PID", "@pid"),
    ("Command", "@command"),
    ("User", "@user"),
]

p = figure(title="Cluster Activity",
           plot_width=1200,
           plot_height=700,
           x_range=nodes,
           y_range=list(reversed(cores)),
           tools='hover',
           toolbar_location=None,
           tooltips=TOOLTIPS
           )

Это работает, но я не хочу показывать всплывающие подсказки со значением None.Например, если конкретный процессор имеет значение «Нет» для пользователя, всплывающая подсказка не должна содержать значение пользователя, а не отображать «Пользователь: ???».

Есть ли способ сделать это?Я не могу найти что-то похожее на это в уроках.Я хотел бы избежать написания пользовательских JS.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Вы также можете динамически создавать всплывающие подсказки, используя обратный вызов JS, прикрепленный к HoverTool (Bokeh 1.1.0)

from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, HoverTool, CustomJS

pid = [1, 2, 3, 4, 5, 6]
user = ['user1', 'user2', 'user3', 'user4', None, 'user6']
name = ['name', 'name2', 'name3', 'name4', 'name5', 'name6']

source = ColumnDataSource(data = dict(pid = pid, user = user, name = name))

p = figure(x_range = FactorRange(*name), sizing_mode = 'stretch_both', title = "Test", toolbar_location = None, tools = "")
p.vbar(x = 'name', top = 'pid', width = 0.2, source = source)

code = '''  hover.tooltips = [["Name", "@name"], ["PID", "@pid"]];
            if (cb_data.index.indices.length > 0) { 
                index = cb_data.index.indices[0];
                counts = source.data.user[index]

                if (counts != null)
                    hover.tooltips = [["Name", "@name"], ["User", "@user"], ["PID", "@pid"]];                                       

            } '''
hover = HoverTool()
hover.callback = CustomJS(args = dict(source = source, hover = hover), code = code)
p.add_tools(hover)

show(p)

Результат:

enter image description here

0 голосов
/ 15 апреля 2019

Я вижу два способа сделать это:

1.Проверка того, что имя равно None с Python и использование нескольких HoverTool

Поскольку HoverTool является bokeh.models.tools, вы можете добавить его с помощью

p.add_tools(hovertool)

Таким образом, вы можете сделать два экземпляраHoverTool и разделите ваши данные на два источника данных:

p = figure(title="Cluster Activity",
           plot_width=1200,
           plot_height=700,
           toolbar_location=None)

without = p.square(name="without", ##your filtered data source without names)
with = p.square(name="with", ##your filtered data source with names)

hoverwith = HoverTool(names=["with"],tooltips=TOOLTIPS = [
        ("Usage", "@{usage}%"),
        ("Name", "@name"),
        ("PID", "@pid"),
        ("Command", "@command"),
        ("User", "@user"),
    ])

hoverwithout = HoverTool(names=["without"],tooltips=TOOLTIPS = [
    ("Usage", "@{usage}%"),
    ("PID", "@pid"),
    ("Command", "@command"),
    ("User", "@user"),
])


p.add_tools(hoverwith, hoverwithout)

С помощью атрибута names HoverTool вы можете указать, для каких глифов будет отображаться наведение.Я не проверял код.

2.Использование пользовательского JS (просто упоминание для полноты)

Если у вас много разных комбинаций возможных пропущенных значений, я рассматриваю только JS как способ сделать это, посмотрите здесь: https://groups.google.com/a/continuum.io/forum/#!msg/bokeh/4VxEbPaLqnA/-qYLDsbZAwAJ

...