0

我按照此处发布的指南使用我自己的数据集创建了一个类似于 Gapminder(动画气泡图)的可视化工具。

一切正常(尽管我必须在我自己的代码中更改指南中的滑块 JavaScript 回调代码的几行代码)。

但是,我注意到当滑块位于位置 0 或 1 时,两个值都将映射到回调引用的源对象中的相同日期。

以供参考:

  • 0 映射到日期 (08/28/2019) 而 1 映射到日期 (08/29/2019)。
  • js_source_array_engagement字符串对象看起来像:{0: _0, 1: _1, 2: _2, 3: _3, 4: _4, 5: _5, 6: _6, 7: _7, 8: _8, 9: _9, 10: _10, 11: _11, 12: _12, 13: _13, 14: _14, 15: _15}
  • engagement_sources是一个字典,具有以下键:'_0', '_1', '_2', '_3', '_4', '_5', '_6', '_7', '_8', '_9', '_10', '_11', '_12', '_13', '_14', '_15'. 键映射到 ColumnDataSource 对象。
  • 因此,String 对象js_source_array_engagement将用于engagement_sources在 JS 回调中引用 。

这是滑块的代码:

''' ############ ADD SLIDER ############ '''
code = """
    var day = slider.value,
        sources = %s,
        new_source_data = sources[day].data;

    console.log(day);
    console.log(sources[day].data['days'][0]);

    text = new_source_data['days'][0];
    renderer_source.data = new_source_data;
    text_source.data = {'days':[text]};
""" % js_source_array_engagement

callback = CustomJS(args=engagement_sources, code=code)
slider = Slider(start=days_indices[0], end=days_indices[-1], value=0, step=1, title="Day", callback=callback)

callback.args["renderer_source"] = renderer_source
callback.args["slider"] = slider
callback.args["text_source"] = text_source

layout_one = layout([[plot], [slider]])

print(engagement_sources['_0'].data['days'][0]) #prints (08/28/2019)
print(engagement_sources['_1'].data['days'][0]) #prints (08/29/2019)

plots = row(layout_one, plot_two)

当我将滑块移动到 0 或 1 时,控制台分别打印 0 和 1。

但是,它们都映射到日期 08/29/2019。我通过打印来检查值是否正确,两个打印语句分别显示 (08/28/2019) 和 (08/29/2019)。

结果,我认为回调的代码可能有问题,特别是代码如何引用源对象,但我无法弄清楚它是什么,特别是因为它正确引用了所有其他值,除非滑块是在 0。

4

1 回答 1

0

如果您遵循该示例,则使用showthen 您正在生成独立输出。这是 Bokeh 创建一堆静态 HTML 和 JS 代码并将其发送到浏览器以显示绘图的模式。但这是重要的部分:与任何 Python 进程都没有任何联系。用这种用法更新滑块只会影响 JavaScript 状态,它对任何 Python 变量或状态都没有影响。如果您想在 Python 和显示的内容(存在于“JavaScript 端”)之间实现完全的双向同步,那么这就是 Bokeh 服务器的用途(这正是它的目的)。

您可以在此处查看如何在笔记本中嵌入 Bokeh 服务器应用程序的示例:

https://github.com/bokeh/bokeh/blob/master/examples/howto/server_embed/notebook_embed.ipynb

此外,您链接的教程相当陈旧,并且采用了一种非常古老的文本替换技术,这在 Bokeh 服务器上下文中根本不需要。您可以在此处查看该 Gapminder 示例的现代(并且非常简单)Bokeh 服务器版本:

https://github.com/bokeh/bokeh/tree/master/examples/app/gapminder

您可以在此处看到该 Gapminder 示例的实时托管演示:

https://demo.bokeh.org/gapminder

于 2019-12-11T01:54:23.373 回答