Python3.6
Bokeh 12.15
我尝试实现bokeh示例off.py,但是在一个for循环中使用了一个悬停工具和不同长度的数据。然而,当一条线被关闭时,它会关闭在它之后创建的任何行的工具尖端。例如,如果我关闭第1行,则禁用第2、3、4行工具提示,或者如果关闭第3行,则禁用第4行的工具提示。
我可以在这样的for循环中使用悬浮工具和复选框小部件吗?我见过这个多行示例,但是我的数据有不同的长度,我不想重采样,因为我想看看是否有坏的或丢失的数据。
码
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极小示例
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)发布于 2018-05-08 16:18:06
在这种情况下,您可能应该为每一行创建一个新的单独的悬停工具,方法是限制每个悬浮工具的renderers属性。因此,相对于您的代码,将悬浮工具创建移动到循环中,并让它每次设置renderers:
line = p.line('x', 'y', source = sources[i])
hover = HoverTool(tooltips=[('date', '@date'),('y', '@y')]
renderers=[line])
p.add_tools(hover)https://stackoverflow.com/questions/50237411
复制相似问题