在 Bokeh 中悬停多行字形时如何显示单个值?
How to show a single value when hovering a Multiline glyph in Bokeh?
至于现在,我看到 Bokeh 支持 multi_line 字形的 HoverTool。
但问题是,如果我想显示点的特定值 - 它会显示所有值列表而不是它。
请看下面的例子:
from bokeh.plotting import show, figure
from bokeh.models import ColumnDataSource, HoverTool
df = {'X_value': [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]],
'model': ['m1', 'm1', 'm2', 'm2'],
'color': ['red', 'red', 'blue', 'blue'],
'Y_value': [[0.50, 0.66, 0.70, 0.67], [0.65, 0.68, 0.71, 0.66], [0.80, 0.79, 0.84, 0.80], [0.80, 0.83, 0.76, 0.64]]}
source = ColumnDataSource(df)
p = figure(plot_height=400)
p.multi_line(xs='X_value', ys='Y_value', legend="model", color='color',
line_width=5, line_alpha=0.6, hover_line_alpha=1.0,
source=source)
p.add_tools(HoverTool(show_arrow=False, line_policy='next', tooltips=[
('X_value', '@X_value'),
('Y_value', '@Y_value')
]))
show(p)
我知道 $x、$y 能力,但它显示在鼠标下是协调的,并且它们会随着您移动鼠标而变化,这不是我们想要的行为。
有没有办法在 multi_line 字形中显示悬停点的精确值?
p.s。创建不可见线不是解决方案,因为我有更高级的带过滤和链接图等的绘图。
谢谢!
如果您更新到散景版本 0.12.16,您可以像这样使用新的 class CustomJSHover
:
from bokeh.plotting import show, figure
from bokeh.models import ColumnDataSource, HoverTool
from bokeh.models.tools import CustomJSHover
df = {'X_value': [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]],
'model': ['m1', 'm1', 'm2', 'm2'],
'color': ['red', 'red', 'blue', 'blue'],
'Y_value': [[0.50, 0.66, 0.70, 0.67], [0.65, 0.68, 0.71, 0.66], [0.80, 0.79, 0.84, 0.80], [0.80, 0.83, 0.76, 0.64]]}
source = ColumnDataSource(df)
p = figure(plot_height=400)
p.multi_line(xs='X_value', ys='Y_value', legend="model", color='color',
line_width=5, line_alpha=0.6, hover_line_alpha=1.0,
source=source)
x_custom = CustomJSHover(code="""
return '' + special_vars.data_x
""")
y_custom = CustomJSHover(code="""
return '' + special_vars.data_y
""")
p.add_tools(
HoverTool(
show_arrow=False,
line_policy='next',
tooltips=[
('X_value', '@X_value{custom}'), # or just ('X_value', '$data_x')
('Y_value', '@Y_value{custom}')
],
formatters=dict(
X_value=x_custom,
Y_value=y_custom
)
)
)
show(p)
根据 Dmitriy 在上述回答中的评论,他说 data_x 和 data_y 现已公开,因此您只需将代码更改为:
p.add_tools(HoverTool(show_arrow=False, line_policy='next', tooltips=[
('X_value', '$data_x'),
('Y_value', '$data_y')
]))
但这有什么好处是您可以使用 Bokeh 格式化程序。例如这是我用于日期时间轴上的值的一个,例如:
plot.add_tools(HoverTool(tooltips=
[
('Date', '$data_x{%F}'),
('Level', '$data_y{0,0.000000}'),
('Ticket', '@ticket')
],
formatters={
'$data_x': 'datetime',
}
))
至于现在,我看到 Bokeh 支持 multi_line 字形的 HoverTool。 但问题是,如果我想显示点的特定值 - 它会显示所有值列表而不是它。
请看下面的例子:
from bokeh.plotting import show, figure
from bokeh.models import ColumnDataSource, HoverTool
df = {'X_value': [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]],
'model': ['m1', 'm1', 'm2', 'm2'],
'color': ['red', 'red', 'blue', 'blue'],
'Y_value': [[0.50, 0.66, 0.70, 0.67], [0.65, 0.68, 0.71, 0.66], [0.80, 0.79, 0.84, 0.80], [0.80, 0.83, 0.76, 0.64]]}
source = ColumnDataSource(df)
p = figure(plot_height=400)
p.multi_line(xs='X_value', ys='Y_value', legend="model", color='color',
line_width=5, line_alpha=0.6, hover_line_alpha=1.0,
source=source)
p.add_tools(HoverTool(show_arrow=False, line_policy='next', tooltips=[
('X_value', '@X_value'),
('Y_value', '@Y_value')
]))
show(p)
我知道 $x、$y 能力,但它显示在鼠标下是协调的,并且它们会随着您移动鼠标而变化,这不是我们想要的行为。
有没有办法在 multi_line 字形中显示悬停点的精确值?
p.s。创建不可见线不是解决方案,因为我有更高级的带过滤和链接图等的绘图。
谢谢!
如果您更新到散景版本 0.12.16,您可以像这样使用新的 class CustomJSHover
:
from bokeh.plotting import show, figure
from bokeh.models import ColumnDataSource, HoverTool
from bokeh.models.tools import CustomJSHover
df = {'X_value': [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]],
'model': ['m1', 'm1', 'm2', 'm2'],
'color': ['red', 'red', 'blue', 'blue'],
'Y_value': [[0.50, 0.66, 0.70, 0.67], [0.65, 0.68, 0.71, 0.66], [0.80, 0.79, 0.84, 0.80], [0.80, 0.83, 0.76, 0.64]]}
source = ColumnDataSource(df)
p = figure(plot_height=400)
p.multi_line(xs='X_value', ys='Y_value', legend="model", color='color',
line_width=5, line_alpha=0.6, hover_line_alpha=1.0,
source=source)
x_custom = CustomJSHover(code="""
return '' + special_vars.data_x
""")
y_custom = CustomJSHover(code="""
return '' + special_vars.data_y
""")
p.add_tools(
HoverTool(
show_arrow=False,
line_policy='next',
tooltips=[
('X_value', '@X_value{custom}'), # or just ('X_value', '$data_x')
('Y_value', '@Y_value{custom}')
],
formatters=dict(
X_value=x_custom,
Y_value=y_custom
)
)
)
show(p)
根据 Dmitriy 在上述回答中的评论,他说 data_x 和 data_y 现已公开,因此您只需将代码更改为:
p.add_tools(HoverTool(show_arrow=False, line_policy='next', tooltips=[
('X_value', '$data_x'),
('Y_value', '$data_y')
]))
但这有什么好处是您可以使用 Bokeh 格式化程序。例如这是我用于日期时间轴上的值的一个,例如:
plot.add_tools(HoverTool(tooltips=
[
('Date', '$data_x{%F}'),
('Level', '$data_y{0,0.000000}'),
('Ticket', '@ticket')
],
formatters={
'$data_x': 'datetime',
}
))