如何在散景的条形图中绘制垂直线?

时间:2019-01-29 06:58:25

标签: bokeh

基于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)

我正在尝试向其x范围为类别的条形图添加一条垂直线。但是,这似乎是不可能的,因为这会引发错误“ ValueError:预期为Real类型的值,得到的苹果类型为str”。

location='Apples'不能按预期的数字工作。

1 个答案:

答案 0 :(得分:2)

一种解决方案是将分类值转换为绘图上的相应数值:

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");