【发布时间】:2019-11-15 09:53:02
【问题描述】:
我正在努力弄清楚如何使用自定义回调来更新 CDS 视图过滤器。一个测试DataFrame如下:
from bokeh.models import ColumnDataSource, Select, CustomJS, CDSView
from bokeh.models.filters import Filter, GroupFilter
from bokeh.plotting import figure
from bokeh.io import show
import pandas as pd
import numpy as np
test = pd.DataFrame({'Title': ['A','A','A','A','A','A','A','A','B','B','B','B','B','B','B','B'],
'Chapter': ['C','C','C','C','D','D','D','D','E','E','E','E','F','F','F','F'],
'Page':[1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4],
'Line':[91,92,93,94,81,82,83,84,71,72,73,74,51,52,53,54]})
目标是生成一个折线图,其中两条线代表不同标题中的不同章节,其中 x 轴是 Page,y 轴是 Line,其中 Title 可以通过 Select 小部件选择。以下代码创建了我正在寻找的图:
test1 = test.groupby('Title', sort = False).apply(lambda x: x.to_dict(orient = 'list'))
graph = ColumnDataSource(data = test1[0])
chapterlist = [*set(test1[0]['Chapter'])]
p = figure(plot_width=600, plot_height=300)
for i in range(len(chapterlist)):
view=CDSView(source=graph,
filters=[GroupFilter(column_name='Chapter', group=chapterlist[i])])
p.line(
x='Page',
y='Line',
source=graph,
view=view,
legend_label = chapterlist[i])
接下来我们可以查看 Select 小部件、回调和显示图表的代码。
callback = CustomJS(args = dict(graph=graph, source= test1.to_dict()), code =
"""
graph.data = source[cb_obj.value];
graph.change.emit();
""")
select.js_on_change('value', callback)
layout = column(select, p)
show(layout)
我在使用 Select 时遇到的 chrome 错误是 group filter: group 'C' did not match any values in column 'Chapter',这是完全可以理解的,因为我没有更新 CustomJS 中的 GroupFilter 以匹配所选标题中的新章节。我尝试从源对象和数据对象访问 GroupFilter,但没有成功。
我需要使用视图开始的原因是因为必须将选择选项设置为“标题”,因此我需要同时提供标题的所有信息,并且需要为两者绘制线条“章”。
感谢任何帮助!
【问题讨论】: