我正在研究显示集群活动的散景人物。当用户将鼠标悬停在特定处理器上时,我希望它显示有关该处理器的统计信息。代码如下:
TOOLTIPS = [
("Usage", "@{usage}%"),
("Name", "@name"),
("PID", "@pid"),
("Command", "@command"),
("User", "@user"),
]
p = figure(title="Cluster Activity",
plot_width=1200,
plot_height=700,
x_range=nodes,
y_range=list(reversed(cores)),
tools='hover',
toolbar_location=None,
tooltips=TOOLTIPS
)
这有效,但是我不想显示值为None的工具提示。例如,如果特定处理器的User值为None,则工具提示中不应包含用户值,而应显示“ User:???”。
有没有办法做到这一点?我似乎在教程中找不到与此类似的东西。我想避免编写自定义JS。
答案 0 :(得分:0)
我看到了两种方法:
1。使用Python检查Name是否为None并使用多个HoverTool
由于HoverTool是bokeh.models.tools,因此您可以通过
添加它NetworkX
因此您可以制作两个HoverTool实例并将数据拆分为两个数据源:
p.add_tools(hovertool)
使用HoverTool的names属性,您可以指定为哪一个glyps渲染悬停。我还没有测试代码。
2。使用自定义JS(为完整起见仅提及)
如果可能的缺失值有许多不同的组合,我只将JS视为做到这一点的一种方法,请看这里:https://groups.google.com/a/continuum.io/forum/#!msg/bokeh/4VxEbPaLqnA/-qYLDsbZAwAJ
答案 1 :(得分:0)
您还可以使用附加到HoverTool
(散景1.1.0)上的JS回调来动态创建工具提示
from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, HoverTool, CustomJS
pid = [1, 2, 3, 4, 5, 6]
user = ['user1', 'user2', 'user3', 'user4', None, 'user6']
name = ['name', 'name2', 'name3', 'name4', 'name5', 'name6']
source = ColumnDataSource(data = dict(pid = pid, user = user, name = name))
p = figure(x_range = FactorRange(*name), sizing_mode = 'stretch_both', title = "Test", toolbar_location = None, tools = "")
p.vbar(x = 'name', top = 'pid', width = 0.2, source = source)
code = ''' hover.tooltips = [["Name", "@name"], ["PID", "@pid"]];
if (cb_data.index.indices.length > 0) {
index = cb_data.index.indices[0];
counts = source.data.user[index]
if (counts != null)
hover.tooltips = [["Name", "@name"], ["User", "@user"], ["PID", "@pid"]];
} '''
hover = HoverTool()
hover.callback = CustomJS(args = dict(source = source, hover = hover), code = code)
p.add_tools(hover)
show(p)
结果: