【问题标题】:bokeh trigger js_on_change for first display of graph散景触发 js_on_change 以首次显示图形
【发布时间】:2020-07-22 20:33:19
【问题描述】:

我正在我的网站中为 pandas 数据源绘制散景图。 pandas 数据框df 如下所示:

X   Y   Type
0   5    A
0   15   B
1   12   A
1   18   B

我添加了一个Select 对象,其值为AB。基本上,用户在该选择对象中选择值AB,我的CustomJS 回调过滤DataSource 并绘制对应于所选类型的图形:

source = ColumnDataSource(df)
select = Select(title="Select Type:", options=['A', 'B'])
callback = CustomJS(args={'source':source}, code = """
    var t = cb_obj.value
    var a = df.filter(function(c){if (c['Type'] == t) return c;});
    source.data['X'] = []
    source.data['Y'] = []
    for (var i=0; i < a.length; i++) {
      source.data['X'].push(a[i]['%s']);
      source.data['Y'].push(a[i]['Y']);
    }
    source.change.emit();
  """
select.value = 'A'

问题是图表在第一次显示时看起来很乱。实际上,它绘制了所有 XY 列,我必须手动更改下拉列表中的默认选择类型才能触发回调并正确过滤数据。

我可以在第一次显示我的图表之前以编程方式触发该回调吗?

【问题讨论】:

    标签: javascript python bokeh


    【解决方案1】:

    没有办法预先触发回调。相反,您应该确保(在 Python 中)将 CDS 初始化为您实际希望显示的正确初始状态。

    但是,如果您尝试在数据子集之间进行选择,那么您上面的方法将无法工作。您实际上是在更新您拥有的唯一数据源,每次回调(您无法取回)都会丢弃数据。相反,您应该使用 select 回调来配置 Bokeh 过滤器:

    https://docs.bokeh.org/en/latest/docs/user_guide/data.html#filtering-data

    具体来说,您可能想要GroupFilter,并且在 Discourse 上有一些示例/讨论:

    https://discourse.bokeh.org/t/scatter-plot-legend-doesnt-update-correctly-when-data-is-updated/5545

    【讨论】:

    • 我的数据框存在于浏览器中。我通过我的渲染器发送它。我正在使用龙卷风
    • 这些都不相关或改变我的答案。您在 Python 代码中创建 CDS,这是您需要确保它正确初始化的地方。从字面上看,您的 DataFrame 绝对不存在于浏览器中,因为浏览器只知道 JavaScript,而对 Python 或 Pandas 一无所知。顾名思义,CustomJS 回调只执行 JavaScript 代码
    • 我已经更新了 Uer 指南中有关过滤的部​​分的链接,因为您似乎正在尝试这样做。
    • 谢谢。在第一次绘图之前,我不知道我可以在 Python 中过滤数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多