我正在努力弄清楚如何使用自定义回调来更新CDS视图过滤器。一个测试数据框如下:
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,可以使用“选择”小部件选择“标题”。以下代码创建了我想要的图形:
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时出现的镶边错误是group filter: group 'C' did not match any values in column 'Chapter'
,这是可以完全理解的,因为我没有更新CustomJS中的GroupFilter来匹配所选标题中的新章节。我尝试从源对象和数据对象访问GroupFilter,但未成功。
我之所以需要使用Views,是因为有必要将select选项设置为“ Title”,因此我需要同时提供标题的所有信息,并且需要为两个“章节”。
感谢您的帮助!
答案 0 :(得分:0)
这是最近on the tracker出现的,结论是CDSView
的使用与行字形不兼容或受其支持。将来的版本将明确提出特定例外,以指出这种不兼容性。关于这个问题,我建议使用散点图,条形图或点图,所有这些都使用与CDSView
一起使用的字形。如果您确实需要使用线条,我最好的建议是使用具体的数据子集将所有线条绘制在前面,并使用JS回调来切换它们的可见性。