【问题标题】:Update CDSView filter with CustomJS for line glyph使用 CustomJS 为行字形更新 CDSView 过滤器
【发布时间】: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,但没有成功。

我需要使用视图开始的原因是因为必须将选择选项设置为“标题”,因此我需要同时提供标题的所有信息,并且需要为两者绘制线条“章”。

感谢任何帮助!

【问题讨论】:

    标签: python bokeh


    【解决方案1】:

    最近出现了on the tracker,结论是CDSView 的使用与行字形不兼容或不支持。未来的版本将明确提出一个特定的异常来说明这种不兼容性。至于这个问题,我会推荐散点图、条形图或点图,所有这些都使用与CDSView 一起使用的字形。如果你真的需要使用线条,我最好的建议是使用具体的数据子集预先绘制所有线条,并使用 JS 回调来切换它们的可见性。

    【讨论】:

    • 感谢您的信息!
    • 从那以后还有什么选择吗?
    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多