有条件的工具提示bokeh堆积图

我正在尝试根据堆积图上的数据创建自定义悬停。在下面的示例中,如果用户将鼠标悬停在“ cat1”上,则应返回“ cat1_text”;分别为“ cat2”和“ cat3”的“ cat2_text”和“ cat3_text”。

对于工具提示,由于$ name将返回'cat1','cat2'或'cat3',我以为通过添加'_text',该值将被相应地调用(但当然,这似乎不是python / bokeh的工作方式)。我也在考虑使用任何函数/索引调用,但不太确定如何使用。好心劝告。非常感谢!

category = ['cat1','cat2','cat3']

data = {'timeVal' : [0,1,2,3,4,5],'cat1'   : [2,4],'cat2'   : [5,6],'cat3'   : [3,5,3],'cat1_text'   : ['a','b','c','d','e','f'],'cat2_text'   : ['a1','b1','c1','d1','e1','f1'],'cat3_text'   : ['a2','b2','c2','d2','e2','f2'],}

toolTipArr = [
    ("name","$name"),("count","@$name"),("info",'@'+'$name'+'_text}')
]

p = figure(x_range=(startTime,endTime),plot_height=250,plot_width=1000,title="project",toolbar_location="right",tools="hover,pan,wheel_zoom,box_zoom,reset",tooltips=toolTipArr)

p.vbar_stack(category,x='timeVal',width=2,color=colors,source=data,legend=[value(x) for x in category])
aaawenaaa 回答:有条件的工具提示bokeh堆积图

$name@$name在进行任何其他文本操作之前先被评估,因此这就是上述方法行不通的原因。您将需要使用CustomJSHover来完成类似的工作

custom = CustomJSHover(args=dict(source=source),code="""
    // use special_vars.name and use special_vars.indices to index in 
    // to the right column of source.data
""")

,

这是bigreddot使用CustomJSHover建议的实现(适用于Bokeh v1.3.0):

from bokeh.core.properties import value
from bokeh.models import ColumnDataSource,CustomJSHover
from bokeh.plotting import figure,show

fruits = ['Apples','Pears','Nectarines','Plums','Grapes','Strawberries']
years = ["2015","2016","2017"]
colors = ["#c9d9d3","#718dbf","#e84d60"]

data = {'fruits' : fruits,'2015'   : [2,1,4,3,2,4],'2016'   : [5,6],'2017'   : [3,5,3]}

source = ColumnDataSource(data=data)

tooltips= [("name","$name"),("count","@$name")]

p = figure(x_range=fruits,plot_height=350,title="Fruit Counts by Year",toolbar_location=None,tooltips=tooltips)

renderers = p.vbar_stack(years,x='fruits',width=0.9,color=colors,source=source,legend=[value(x) for x in years],name=years)

p.hover[0].tooltips.append(('info','$name{custom}'))
p.hover[0].formatters = {'$name' : CustomJSHover(code = "return special_vars.name + '_text'")}

show(p)

再多花点功夫,就可以使用CustomJS回调(Bokeh v1.3.0)实现相同的目标:

from bokeh.core.properties import value
from bokeh.models import ColumnDataSource,HoverTool,CustomJS
from bokeh.plotting import figure,3]}

source = ColumnDataSource(data=data)

p = figure(x_range=fruits,tools="")

renderers = p.vbar_stack(years,name=years)

hover_code = "if (cb_data.index.indices.length > 0) { cb_obj.tooltips[2] = ['info',cb_obj.name + '_text'] }"

for renderer in renderers:
    p.add_tools (HoverTool(tooltips=[("name","@$name"),("info","@info"),],renderers=[renderer],name = renderer.name,callback = CustomJS(code = hover_code)))
show(p)

enter image description here

本文链接:https://www.f2er.com/3157493.html

大家都在问