Как показать одно значение при наведении многострочного глифа в боке? - PullRequest
0 голосов
/ 14 мая 2018

На данный момент я вижу, что Bokeh поддерживает HoverTool для многолинейного глифа.Но проблема в том, что если я хочу отобразить конкретное значение для точки - вместо него отображается весь список значений.

Пожалуйста, см. Пример ниже:

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

df = {'X_value': [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]], 
      'model': ['m1', 'm1', 'm2', 'm2'], 
      'color': ['red', 'red', 'blue', 'blue'],
      'Y_value': [[0.50, 0.66, 0.70, 0.67], [0.65, 0.68, 0.71, 0.66], [0.80, 0.79, 0.84, 0.80], [0.80, 0.83, 0.76, 0.64]]}

source = ColumnDataSource(df)

p = figure(plot_height=400)
p.multi_line(xs='X_value', ys='Y_value', legend="model", color='color',
             line_width=5, line_alpha=0.6, hover_line_alpha=1.0,
             source=source)

p.add_tools(HoverTool(show_arrow=False, line_policy='next', tooltips=[
    ('X_value', '@X_value'),
    ('Y_value', '@Y_value')
]))

show(p)

enter image description here

Я знаю о способности $ x, $ y, но она показывает скоординированность под мышью, и они меняются при перемещении мыши, что не является желательным поведением.

Есть ли способ отобразить точное значение для точки наведения в многострочном глифе?

ps создание невидимой линии не является решением, так как у меня есть более продвинутый график с фильтрацией и связанными графиками и т. Д.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Исходя из комментария Дмитрия в ответе выше, он сказал, что data_x и data_y теперь доступны, поэтому вам просто нужно изменить код на:

p.add_tools(HoverTool(show_arrow=False, line_policy='next', tooltips=[
    ('X_value', '$data_x'),
    ('Y_value', '$data_y')
]))

Но что приятно в этом, вы можете использовать форматеры Bokeh. например это тот, который я использовал для значений на оси времени и даты, например:

plot.add_tools(HoverTool(tooltips=
    [
        ('Date',  '$data_x{%F}'),
        ('Level', '$data_y{0,0.000000}'),
        ('Ticket', '@ticket')
    ],
    formatters={
        '$data_x': 'datetime',
    }
))
0 голосов
/ 15 мая 2018

Если вы обновитесь до версии bokeh 0.12.16, вы можете использовать новый класс CustomJSHover следующим образом:

from bokeh.plotting import show, figure
from bokeh.models import ColumnDataSource, HoverTool
from bokeh.models.tools import CustomJSHover


df = {'X_value': [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]], 
      'model': ['m1', 'm1', 'm2', 'm2'], 
      'color': ['red', 'red', 'blue', 'blue'],
      'Y_value': [[0.50, 0.66, 0.70, 0.67], [0.65, 0.68, 0.71, 0.66], [0.80, 0.79, 0.84, 0.80], [0.80, 0.83, 0.76, 0.64]]}

source = ColumnDataSource(df)

p = figure(plot_height=400)
p.multi_line(xs='X_value', ys='Y_value', legend="model", color='color',
             line_width=5, line_alpha=0.6, hover_line_alpha=1.0,
             source=source)

x_custom = CustomJSHover(code="""
    return '' + special_vars.data_x
""")

y_custom = CustomJSHover(code="""
    return '' + special_vars.data_y
""")

p.add_tools(
    HoverTool(
        show_arrow=False, 
        line_policy='next',
        tooltips=[
            ('X_value', '@X_value{custom}'),  # or just ('X_value', '$data_x')
            ('Y_value', '@Y_value{custom}')
        ],
        formatters=dict(
            X_value=x_custom,
            Y_value=y_custom
        )
    )
)

show(p)
...