Как изобразить вертикальную линию на баровом графике в Боке? - PullRequest
0 голосов
/ 29 января 2019

Основываясь на первом примере руководства пользователя Bokeh,

from bokeh.io import show, output_file
from bokeh.plotting import figure
from bokeh.models import Span

output_file("bars.html")

fruits = ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries']
counts = [5, 3, 4, 2, 4, 6]

p = figure(x_range=fruits, plot_height=250, title="Fruit Counts",
           toolbar_location=None, tools="")

p.vbar(x=fruits, top=counts, width=0.9)

# these two lines
vline = Span(location='Apples', dimension='height', line_color='blue', line_width=4)
p.renderers.extend([vline])

p.xgrid.grid_line_color = None
p.y_range.start = 0

show(p)

Я пытаюсь добавить вертикальную линию к гистограмме, чей диапазон х - это категории.Однако это не представляется возможным, так как при этом возникает ошибка «ValueError: ожидаемое значение типа Real, получены яблоки типа str».

location='Apples' не работает так, как предполагалосьчисло.

1 Ответ

0 голосов
/ 29 января 2019

Одним из решений является преобразование категориального значения в соответствующее числовое значение на графике:

index = p.x_range.factors.index("Apples")
delta = (p.x_range.end - p.x_range.start)/p.x_range.factors.length;
location = delta/2 + index;

Если график динамический (например, значения неизвестны при построении графика), тогда используйтевспомогательная функция JS для преобразования:

function _value_to_location(x_range, value) {
    var index = x_range.factors.findIndex(x => x == value)
    var delta = (x_range.end - x_range.start)/x_range.factors.length;
    return delta/2 + index;
};

...

vline.location = _value_to_location(figure.x_range, "Apples");
...