使用CustomJS更新CDSView过滤器的线字形

时间:2019-11-15 00:23:24

标签: python bokeh

我正在努力弄清楚如何使用自定义回调来更新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”,因此我需要同时提供标题的所有信息,并且需要为两个“章节”。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这是最近on the tracker出现的,结论是CDSView的使用与行字形不兼容或受其支持。将来的版本将明确提出特定例外,以指出这种不兼容性。关于这个问题,我建议使用散点图,条形图或点图,所有这些都使用与CDSView一起使用的字形。如果您确实需要使用线条,我最好的建议是使用具体的数据子集将所有线条绘制在前面,并使用JS回调来切换它们的可见性。