如何提供从JSON加载的Bokeh文档?

时间:2019-04-18 13:37:05

标签: bokeh

我想将bokeh文档序列化为JSON,使用DaggerAppCompatActivityfrom_json [3]再次加载并提供它。

但是,大多数示例还是通过修改from_json_string [1]或通过创建接收和修改文档的应用程序[2]来创建服务器。

我正在使用全息视图生成图的事实不应更改问题,因此无论如何这都不是全息视图问题;)。

curdoc

现在,我想创建类似以下内容的文件:

import pandas as pd
import holoviews as hv
from bokeh.document import Document
from bokeh.io.doc import curdoc, set_curdoc
import json
hv.extension('matplotlib')
hv.extension('bokeh')

print("- create dummy data")
df = pd.DataFrame(dict(x=[1, 2], y=[0, 1]))
print(df)

print("- plot as holoviews curve")
curve = hv.Curve(df, 'x', 'y', label='curve1').opts(ylabel='y')

print("- render in bokeh")
plot = hv.render(curve, backend='bokeh')

print("- serialize as bokeh document to JSON")
doc = Document()
doc.add_root(plot)
doc_json = doc.to_json()
json_string = json.dumps(doc_json)

print("- deserialize as bokeh document")
doc2 = Document.from_json_string(json_string)
print(doc2.roots[0])

这确实可以运行,但是在我的浏览器中什么也没有显示。原因是该应用程序实际上需要print("- embed document in bokeh application") from bokeh.application.application import Application app = Application() app.initialize_document(doc) print("- start bokeh server") from bokeh.server.server import Server server = Server( {'/fubar':app}, # list of Bokeh applications port=5010, num_procs=1 ) print("- starting server on 'http://localhost:5010/fubar'") server.start() server.io_loop.start() 而不是Handler。但是我没有找到有关如何将它们相互翻译的文档。

Tl; Dr我如何配置bokeh服务器以处理反序列化的文档?

[1] https://bokeh.pydata.org/en/latest/docs/user_guide/server.html
[2] https://bokeh.pydata.org/en/latest/docs/reference/application/handlers/function.html
[3] https://bokeh.pydata.org/en/latest/docs/reference/document.html

1 个答案:

答案 0 :(得分:0)

感谢Bryan Van de Ven,我终于明白了。诀窍是改用replace_with_json

import pandas as pd
import holoviews as hv
from bokeh.document import Document
from bokeh.io.doc import curdoc, set_curdoc
import json
hv.extension('matplotlib')
hv.extension('bokeh')

print("- create dummy data")
df = pd.DataFrame(dict(x=[1, 2], y=[0, 1]))
print(df)

print("- plot as holoviews curve")
curve = hv.Curve(df, 'x', 'y', label='curve1').opts(ylabel='y')

print("- render in bokeh")
plot = hv.render(curve, backend='bokeh')

print("- serialize as bokeh document to JSON")
doc = Document()
doc.add_root(plot)
doc_json = doc.to_json()
json_string = json.dumps(doc_json)

print("- deserialize as bokeh document")
curdoc().replace_with_json(json.loads(json_string))

不幸的是,这不适用于用holoviews创建的动态内容。在更复杂的示例中,仅保留了静态内容。看来,在这些情况下,除了在服务器上真正执行分析之外,实际上没有其他方法。