curdoc()的目的是什么?

26

我一直在玩bokeh一段时间,现在想创建交互式图并将其嵌入到网上(例如在WordPress帖子中)。

然而,尽管我花了一些时间查看和测试bokeh网站示例代码,但我很难理解curdoc()的确切目的。它似乎是创建具有小部件的bokeh应用程序所必需的,但从我在资源中找到的内容来看,我不太理解它。

1个回答

50

需要先了解一些术语。当你创建一个Bokeh图时,它由许多较小的对象组成,例如glyphs、ranges、data sources和tools等。而图本身则是所有这些其他对象的容器。包括Plot在内的所有这些对象都被称为模型。其他模型包括布局(例如rowcolumn),以及内置到Bokeh中的小部件(如SliderSelect)。

对于Python端的每个模型,都有一个相应的JavaScript对象来实现该模型,并在浏览器中执行绘制或交互所需的所有工作。Bokeh的工作方式是可以自动将一组Python模型转换为一堆JSON,然后BokehJS可以从中重新构建所有相应的JS对象。

文档是Bokeh 模型的集合。它是最小的“序列化单位”。也就是说,通常不会将单个Python模型(比如Plot)转换为JSON,因为该对象可能涉及到许多其他对象(如坐标轴或glyphs等)。因此,在Bokeh 文档中的一组模型可以以有意义的方式一起转换为JSON。

以上内容适用于创建单独的文档(例如使用output_file),或在Bokeh服务器上创建Bokeh应用程序。对于Bokeh应用程序,应用程序代码本身实际上只是修改文档的配方。因此,每当创建Bokeh应用程序会话(即每当用户在Bokeh服务器上打开指向Bokeh应用程序的URL)时,都会为其创建一个新的空白Document,并运行应用程序代码,其中该会话的新Document作为curdoc()提供。然后,应用程序代码可以向此文档中添加内容(例如使用curdoc().add_root(...)),一旦应用程序代码完成,"completed"文档就会转换为JSON并发送到BokehJS以显示给用户。
最后要提到的是,Bokeh服务器的主要目的是确保以这种方式创建的Bokeh文档自动与浏览器中用户的视图保持同步。如果用户滑动滑块,那么将在浏览器中更新Slider模型,这将自动将Python Document中的Slider对象更新为Bokeh服务器中的Python Document。应用程序可以响应此操作并进行其他更改(例如更新Python数据源),这会导致JS数据源也更新(从而使绘图发生变化)。这种自动的双向同步是使Bokeh服务器具备所有复杂交互功能的基础。

3
这是一个很棒的答案,为什么它不是文档/教程的一部分?我可以补充一下无用的旁白,即curdoc()代表当前文档对象。 - eric
2
没有人可以想到所有的事情。开源的承诺在于它可以成为用户、维护者和其他人之间更广泛的合作,使得大家可以一起完成更多的工作,比任何个人或即使是小团队都要更多。我鼓励您通过提交一个github issue(最好还能参与实现)来帮助改进文档。 - bigreddot
1
有一天我希望能做出贡献,但现在我自己还在学习bokeh。根据你的回答,我猜你也是一个开发者——如果是的话,恭喜你,bokeh很棒! - eric
2
感谢您的赞扬,即使只是一个问题,也是非常有价值的贡献。此外,FYI Bokeh 有自己的 Discourse 论坛,对于更加开放性的问题,这个论坛通常比 Stack Overflow 更好用:https://discourse.bokeh.org/ - bigreddot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接