Таинственное поведение боке hovertool (несколько коробок) - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть некоторые данные, которые в некоторых местах пропускают значения. По какой-то причине, только зависание над данными ПОСЛЕ последнего перерыва в данных показывает только одну рамку при наведении, как и ожидалось. Данные между последним перерывом и вторым по последним показывают 3 поля. (Снимок экрана по какой-то причине не захватывал мышь. На левом рисунке это слева от дыры в кривой, на правом изображении - справа.) Наведение на данные между вторым и третьим до последнего разрывами в данных генерирует 5 коробок. И так далее ... Значения в дополнительных полях не изменяются при перемещении курсора, и все они также различаются, а поля сдвигаются и отображаются только в последнем фрагменте данных. Есть мысли о том, что здесь происходит?

Я попытался сделать минимальный пример, но затем проблема исчезла ... Может быть, кто-то может определить, что не так с оригинальным кодом?

import numpy as np
import pandas as pd
import warnings
from bokeh.layouts import widgetbox
from bokeh.plotting import figure, show, output_file, output_notebook
from bokeh.palettes import Spectral11, colorblind, Inferno, BuGn, brewer
from bokeh.models import HoverTool, value, LabelSet, Legend, ColumnDataSource, LinearColorMapper, BasicTicker, PrintfTickFormatter, ColorBar
from bokeh.models.widgets import DateRangeSlider, CheckboxButtonGroup
from bokeh.models import CustomJS, ColumnDataSource
from bokeh.layouts import column, row
from json import loads
import ast

warnings.filterwarnings('ignore')


minD = data['Date'].values[0]
maxD = data['Date'].values[-1]


def datetime(x):
    return np.array(x, dtype=np.datetime64)


TOOLS = 'save,pan,box_zoom,reset,wheel_zoom'
p = figure(y_axis_type="linear",
           plot_height=400, tools=TOOLS, plot_width=1300,
           x_range=(minD, maxD), x_axis_type="datetime")

source = ColumnDataSource(data={
        'Date': datetime(data['Date']),
        'x': data['x'],
        'y': data['y'],
        'z': data['z']})

p.xaxis.axis_label = 'Date'
p.yaxis.axis_label = 'Position (m)'


def add_plot(y, color):
    new_plot = p.line(x='Date', y=y, line_width=1, color=color, source=source)
    return new_plot


x = add_plot('x', 'red')
y = add_plot('y', 'green')
z = add_plot('z', 'blue')

checkbox = CheckboxButtonGroup(labels=['x', 'y', 'z'], active=[0, 1, 2])
checkbox.callback = CustomJS(args=dict(x=x, y=y, z=z), code="""
    //console.log(cb_obj.active);
    x.visible = false;
    y.visible = false;
    z.visible = false;
    for (i in cb_obj.active) {
        //console.log(cb_obj.active[i]);
        if (cb_obj.active[i] == 0) {
            x.visible = true;
        } else if (cb_obj.active[i] == 1) {
            y.visible = true;
        } else if (cb_obj.active[i] == 2) {
            z.visible = true;
        }
    }
""")

callback = CustomJS(args=dict(p=p), code="""
    var a = cb_obj.value;
    p.x_range.start = a[0];
    p.x_range.end = a[1];
""")

start_date = pd.to_datetime(minD)
end_date = pd.to_datetime(maxD)
range_slider = DateRangeSlider(start=start_date, end=end_date,
                               value=(start_date, end_date), step=1)
range_slider.js_on_change('value', callback)


def get_hovertools():
    hovers = {'x': x, 'y': y, 'z': z}
    for k, v in hovers.items():
        hovers[k] = HoverTool(mode='vline', renderers=[v])
        hovers[k].tooltips = [('Date', '@Date{%F %H:%M:%S.%u}'),
                              (k, '@{'+k+'}{%0.2f}m')]
        hovers[k].formatters = {'Date': 'datetime', k: 'printf'}
        p.add_tools(hovers[k])


get_hovertools()

layout = column(p, widgetbox(checkbox), widgetbox(range_slider))

show(layout)

enter image description here

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Вы используете mode = 'vline' в HoverTool, поэтому, если линия очень крутая, в глифе может быть много точек, имеющих одинаковую координату y, поэтому при наведении курсора все они будут отображаться и будут отображаться несколько полей. Установка режима на mode = "mouse" должна помочь

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

Оказывается, некоторые из моих дат были NaT ... действительно странно, что именно так они решили обработать их, отображая только соответствующие поля наведения на значениях после последнего NaT ... bokeh сбивает меня с толку .....

...