如何在 Bokeh 中添加固定位置的工具提示?
How to add a fixed-position tooltip in Bokeh?
我的目标是在我的图形中添加一个 HoverTool
,它按名称显示工作日。日期由 x 轴值定义。即使可见部分被 BoxZoom
.
之类的工具更改,我也想在固定位置显示此信息
由于 HoverTool 至少需要一个渲染器,我首先尝试定义一条线,但我没有找到一种方法来定义相对于图形的位置。事实上,如果我缩放它可能会发生,这条线不在可见部分并且 HoverTool 不再工作(或在不可见的区域)。
我的第二次尝试是定义一个 extra_y_range
来绘制相对线。但是我没有找到取消选择该轴的 BoxZoom 的方法。
import pandas as pd
from bokeh.plotting import figure, output_notebook, show
from bokeh.models import (
HoverTool,
LinearAxis,
Range1d,
)
output_notebook()
dr = pd.date_range('2020-01-01', '2020-01-05', freq='D')
p = figure(title="line", plot_width=300, plot_height=300, x_axis_type='datetime')
p.line(x=dr, y=[6, 7, 2, 4, 5])
p.extra_y_ranges.update({"extra": Range1d(0, 1)})
p.add_layout(LinearAxis(y_range_name="extra", axis_label=''), "right")
l = p.line(x=dr, y=0.8, color='gray', **{"y_range_name":"extra"})
p.add_tools(
HoverTool(
tooltips=[("", "@x{%A}")],
renderers=[l],
mode="vline",
formatters={"@x": "datetime"},
))
show(p)
有没有办法添加一个 HoverTool,即使该区域受到工具的影响,它仍保持在可见区域的相同位置?
您可以试试这个适用于 Bokeh v2.1.1 的解决方案。在下面的代码中,工具提示固定在屏幕上的绝对位置。您可以独立于屏幕上的绘图位置添加自己更通用的解决方案。
from bokeh.models import CustomJS
from bokeh.models import HoverTool
from bokeh.plotting import show, figure
import numpy as np
p = figure(plot_width = 300, plot_height = 300, tooltips = [('value X', '@x'), ('value Y', '@y')])
circles = p.circle(x=np.random.rand(10)*10, y=np.random.rand(10)*10, size=10)
callback = CustomJS(args={'p': p}, code="""
var tooltips = document.getElementsByClassName("bk-tooltip");
const tw = 100;
for (var i = 0; i < tooltips.length; i++) {
tooltips[i].style.top = '5px';
tooltips[i].style.left = p.width/2 - tw/2 + 'px';
tooltips[i].style.width = tw + 'px';
} """)
hover = p.select_one(HoverTool)
hover.renderers = [circles]
hover.callback = callback
hover.show_arrow = False
show(p)
结果:
我的目标是在我的图形中添加一个 HoverTool
,它按名称显示工作日。日期由 x 轴值定义。即使可见部分被 BoxZoom
.
由于 HoverTool 至少需要一个渲染器,我首先尝试定义一条线,但我没有找到一种方法来定义相对于图形的位置。事实上,如果我缩放它可能会发生,这条线不在可见部分并且 HoverTool 不再工作(或在不可见的区域)。
我的第二次尝试是定义一个 extra_y_range
来绘制相对线。但是我没有找到取消选择该轴的 BoxZoom 的方法。
import pandas as pd
from bokeh.plotting import figure, output_notebook, show
from bokeh.models import (
HoverTool,
LinearAxis,
Range1d,
)
output_notebook()
dr = pd.date_range('2020-01-01', '2020-01-05', freq='D')
p = figure(title="line", plot_width=300, plot_height=300, x_axis_type='datetime')
p.line(x=dr, y=[6, 7, 2, 4, 5])
p.extra_y_ranges.update({"extra": Range1d(0, 1)})
p.add_layout(LinearAxis(y_range_name="extra", axis_label=''), "right")
l = p.line(x=dr, y=0.8, color='gray', **{"y_range_name":"extra"})
p.add_tools(
HoverTool(
tooltips=[("", "@x{%A}")],
renderers=[l],
mode="vline",
formatters={"@x": "datetime"},
))
show(p)
有没有办法添加一个 HoverTool,即使该区域受到工具的影响,它仍保持在可见区域的相同位置?
您可以试试这个适用于 Bokeh v2.1.1 的解决方案。在下面的代码中,工具提示固定在屏幕上的绝对位置。您可以独立于屏幕上的绘图位置添加自己更通用的解决方案。
from bokeh.models import CustomJS
from bokeh.models import HoverTool
from bokeh.plotting import show, figure
import numpy as np
p = figure(plot_width = 300, plot_height = 300, tooltips = [('value X', '@x'), ('value Y', '@y')])
circles = p.circle(x=np.random.rand(10)*10, y=np.random.rand(10)*10, size=10)
callback = CustomJS(args={'p': p}, code="""
var tooltips = document.getElementsByClassName("bk-tooltip");
const tw = 100;
for (var i = 0; i < tooltips.length; i++) {
tooltips[i].style.top = '5px';
tooltips[i].style.left = p.width/2 - tw/2 + 'px';
tooltips[i].style.width = tw + 'px';
} """)
hover = p.select_one(HoverTool)
hover.renderers = [circles]
hover.callback = callback
hover.show_arrow = False
show(p)
结果: