首次显示图形的散景触发器 js_on_change

bokeh trigger js_on_change for first display of graph

我正在根据我网站中的 pandas 数据源绘制散景图。 pandas 数据框 df 看起来像这样:

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

我添加了一个 Select 对象,其值为 AB。基本上,用户 select 是 select 对象中的值 AB,而我的 CustomJS 回调过滤 DataSource 并绘制对应于select编辑类型:

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 列,我必须手动更改下拉列表中的默认 selected 类型以触发回调并正确过滤数据。

我能否以某种方式在首次显示我的图表之前以编程方式触发该回调?

无法预先触发回调。相反,您应该确保(在 Python 中)CDS 已初始化为您实际想要显示的正确初始状态。

但是,如果您尝试做的是 select 数据子集之间的操作,那么上述方法将不起作用。您实际上是在更新您拥有的唯一数据源,在每次回调时都会 丢弃数据 (您无法取回)。相反,您应该使用 select 回调来配置散景滤镜:

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

具体来说,您可能想要一个 GroupFilter,Discourse 上有一些 example/discussion:

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