我一直在玩bokeh一段时间,现在想创建交互式图并将其嵌入到网上(例如在WordPress帖子中)。
然而,尽管我花了一些时间查看和测试bokeh网站示例代码,但我很难理解curdoc()的确切目的。它似乎是创建具有小部件的bokeh应用程序所必需的,但从我在资源中找到的内容来看,我不太理解它。
我一直在玩bokeh一段时间,现在想创建交互式图并将其嵌入到网上(例如在WordPress帖子中)。
然而,尽管我花了一些时间查看和测试bokeh网站示例代码,但我很难理解curdoc()的确切目的。它似乎是创建具有小部件的bokeh应用程序所必需的,但从我在资源中找到的内容来看,我不太理解它。
需要先了解一些术语。当你创建一个Bokeh图时,它由许多较小的对象组成,例如glyphs、ranges、data sources和tools等。而图本身则是所有这些其他对象的容器。包括Plot在内的所有这些对象都被称为模型。其他模型包括布局(例如row
和column
),以及内置到Bokeh中的小部件(如Slider
或Select
)。
对于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以显示给用户。Slider
模型,这将自动将Python Document中的Slider对象更新为Bokeh服务器中的Python Document。应用程序可以响应此操作并进行其他更改(例如更新Python数据源),这会导致JS数据源也更新(从而使绘图发生变化)。这种自动的双向同步是使Bokeh服务器具备所有复杂交互功能的基础。
curdoc()
代表当前文档对象。 - eric