条件工具提示散景堆叠图
Conditional tooltip bokeh stacked chart
我正在尝试根据堆叠图表上的数据创建自定义悬停。在下面的示例中,如果用户将鼠标悬停在 'cat1' 上,则 'cat1_text' 应该被 returned; 'cat2_text' 和 'cat3_text' 对应 'cat2' 和 'cat3'。
对于工具提示,由于 $name 将 return 'cat1'、'cat2' 或 'cat3',我认为通过添加“_text”,值将是相应地调用(当然这似乎不是 python/bokeh 的工作方式)。我也在考虑使用任何 function/index 调用,但不太确定该怎么做。好心的建议。非常感谢!
category = ['cat1', 'cat2', 'cat3']
data = {'timeVal' : [0,1,2,3,4,5],
'cat1' : [2, 1, 4, 3, 2, 4],
'cat2' : [5, 3, 4, 2, 4, 6],
'cat3' : [3, 2, 4, 4, 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])
$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, 3, 4, 2, 4, 6],
'2017' : [3, 2, 4, 4, 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, 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, 3, 4, 2, 4, 6],
'2017' : [3, 2, 4, 4, 5, 3]}
source = ColumnDataSource(data=data)
p = figure(x_range=fruits, plot_height=350, title="Fruit Counts by Year",
toolbar_location=None, tools="")
renderers = p.vbar_stack(years, x='fruits', width=0.9, color=colors, source=source,
legend=[value(x) for x in 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"),
("count", "@$name"),
("info", "@info"), ],
renderers=[renderer],
name = renderer.name,
callback = CustomJS(code = hover_code)))
show(p)
我正在尝试根据堆叠图表上的数据创建自定义悬停。在下面的示例中,如果用户将鼠标悬停在 'cat1' 上,则 'cat1_text' 应该被 returned; 'cat2_text' 和 'cat3_text' 对应 'cat2' 和 'cat3'。
对于工具提示,由于 $name 将 return 'cat1'、'cat2' 或 'cat3',我认为通过添加“_text”,值将是相应地调用(当然这似乎不是 python/bokeh 的工作方式)。我也在考虑使用任何 function/index 调用,但不太确定该怎么做。好心的建议。非常感谢!
category = ['cat1', 'cat2', 'cat3']
data = {'timeVal' : [0,1,2,3,4,5],
'cat1' : [2, 1, 4, 3, 2, 4],
'cat2' : [5, 3, 4, 2, 4, 6],
'cat3' : [3, 2, 4, 4, 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])
$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, 3, 4, 2, 4, 6],
'2017' : [3, 2, 4, 4, 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, 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, 3, 4, 2, 4, 6],
'2017' : [3, 2, 4, 4, 5, 3]}
source = ColumnDataSource(data=data)
p = figure(x_range=fruits, plot_height=350, title="Fruit Counts by Year",
toolbar_location=None, tools="")
renderers = p.vbar_stack(years, x='fruits', width=0.9, color=colors, source=source,
legend=[value(x) for x in 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"),
("count", "@$name"),
("info", "@info"), ],
renderers=[renderer],
name = renderer.name,
callback = CustomJS(code = hover_code)))
show(p)