首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在带复选框小部件的循环中使用Bokeh悬停工具

问如何在带复选框小部件的循环中使用Bokeh悬停工具
EN

Stack Overflow用户
提问于 2018-05-08 15:36:19
回答 1查看 685关注 0票数 0

Python3.6

Bokeh 12.15

我尝试实现bokeh示例off.py,但是在一个for循环中使用了一个悬停工具和不同长度的数据。然而,当一条线被关闭时,它会关闭在它之后创建的任何行的工具尖端。例如,如果我关闭第1行,则禁用第2、3、4行工具提示,或者如果关闭第3行,则禁用第4行的工具提示。

我可以在这样的for循环中使用悬浮工具和复选框小部件吗?我见过这个多行示例,但是我的数据有不同的长度,我不想重采样,因为我想看看是否有坏的或丢失的数据。

码

代码语言:javascript
复制
from bokeh.plotting import figure
from bokeh.models import CheckboxGroup, CustomJS
from bokeh.models import ColumnDataSource
import pandas as pd
from bokeh.models import HoverTool

def create_plot(df_list):
    p = figure(x_axis_type = 'datetime')
    glyph_dict = {}
    labels = []
    active = []
    items = []
    names = 'abcdefghijklmnopqrstuvwxyz'
    callback_string = '{}.visible = {} in checkbox.active;'
    code_string = ''
    i = 0
    sources = []
    for df in df_list:
        legend = df.columns[0]
        series = df.iloc[:,0]
        labels.append(legend)
        x = series.index
        y = series.values
        source =ColumnDataSource(data = {'x':x,'y':y, 'date': [str(x) for x in x]})
        sources.append(source)
        line = p.line('x', 'y', source = sources[i])
        items.append((legend, [line]))
        name = names[i]
        line.name = name
        code_string += callback_string.format(name, str(i))
        glyph_dict.update({name:line})
        active.append(i)
        i+=1
    hover = HoverTool(tooltips=[('date', '@date'),('y', '@y')])
    p.add_tools(hover)
    checkbox = CheckboxGroup(labels=labels, active=active, width=200)
    glyph_dict.update({'checkbox':checkbox})
    checkbox.callback = CustomJS.from_coffeescript(args=glyph_dict, code=code_string)
    return checkbox, p

极小示例

代码语言:javascript
复制
import numpy as np
from datetime import datetime, timedelta
from bokeh.layouts import row
from bokeh.plotting import show


df_list = []
start = datetime(2017, 4,1)
end = datetime(2017,5,1)
for i in range(1,5):
    date = pd.date_range(start, end, freq = '1w')
    shape = len(date)
    df = pd.DataFrame(index = date, data = np.random.randn(shape,1))
    name = 'df'+ str(i)
    df.columns = [name]
    end = end + timedelta(weeks = 1)
    df_list.append(df)


c,p = create_plot(df_list)
r=row([c,p])

show(r)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-08 16:18:06

在这种情况下,您可能应该为每一行创建一个新的单独的悬停工具,方法是限制每个悬浮工具的renderers属性。因此,相对于您的代码,将悬浮工具创建移动到循环中,并让它每次设置renderers:

代码语言:javascript
复制
line = p.line('x', 'y', source = sources[i])
hover = HoverTool(tooltips=[('date', '@date'),('y', '@y')]
                  renderers=[line])
p.add_tools(hover)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50237411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档