Как я могу подать документ Bokeh, загруженный из JSON? - PullRequest
0 голосов
/ 18 апреля 2019

Я хочу сериализовать документ bokeh в JSON, загрузить его снова, используя from_json и from_json_string [3], и обработать его.

Тем не менее, большинство примеров либо создают свой сервер, изменяя curdoc [1], либо создавая приложение, которое получает и изменяет документ [2].

Тот факт, что яиспользование holoviews для генерации сюжета не должно менять вопрос, так что это ни в коем случае не вопрос holoviews;).

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, а не Document.Но я не нашел документации о том, как я могу перевести одно на другое.

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 голосов
/ 28 апреля 2019

Благодаря Брайану Ван де Вен я наконец-то получил его.Хитрость заключается в том, чтобы использовать 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.В более сложном примере был сохранен только статический контент.Похоже, что для этих случаев в настоящее время действительно нет другого метода, кроме реального выполнения анализа на сервере.

...