Сохранение панели Bokeh (автономной) со всеми данными, сделанными внутри - PullRequest
2 голосов
/ 31 марта 2020

Есть ли способ сохранить панель инструментов Bokeh после ее редактирования?

Например, я загрузил панель инструментов, создал несколько графиков и сохранил их (последняя вкладка). И затем я хочу сохранить свой «прогресс» в. html -файл, чтобы мне не приходилось делать все это снова каждый раз после инициализации моего скрипта.

Это скриншот моей панели инструментов : enter image description here

Спасибо!

1 Ответ

2 голосов
/ 01 апреля 2020

Таким образом, решение таково:
1
Преобразование вашего bokeh-документа (всей панели инструментов) в. json и загрузка его в виде файла.

Например, вы делаете это щелкнув по кнопке.

#  creating button
download_json = Button(label="Download json", width=70)
# callback
download_json_func = CustomJS(args=dict(source=source_fill_groupby),code="""
function saveText(text, filename){
var a = document.createElement('a');
a.setAttribute('href', 'data:text/plain;charset=utf-8,'+encodeURIComponent(text));
a.setAttribute('download', filename);
a.click()
}
var obj = Bokeh.documents[0].to_json_string();
saveText( JSON.stringify(obj), "filename.json" );
""")
# assigning callback to the button
download_json.js_on_event(ButtonClick, download_json_func)

2
После того, как вы загрузили свой файл, вам необходимо восстановить его в следующей ячейке вашего ноутбука Jupyter. Допустим, должен быть FileInput-widget, чтобы мы могли загрузить наш файл, и он появился бы в блоке div.

from bokeh.models.widgets import FileInput
# creating div where our saved dashboard will be shown
div = Div(text='<div id="document-container"></div>', width=500, height=500)
# adding widget
l = FileInput(accept='.json')
# callback
l.js_on_change('value', CustomJS(code="""\
const {Document} = Bokeh.require('document/document');
// uploaded .json-file  
const data = JSON.parse(atob(cb_obj.value));            
const doc = Document.from_json_string(data);
// dashboard to show
Bokeh.embed.add_document_standalone(doc, document.getElementById('document-container'), [], true);                                     
cb_obj.disabled = true;
"""))

show(column(l, div))

У него все еще есть некоторые проблемы - он не показывает cirylli c правильно и заговор не будет обновлять их диапазоны от последнего, после которого do c был сохранен, если вы делаете новые запросы и создаете новые заговоры. Также есть некоторая проблема с сохранением графиков на последней вкладке - это не работает, как это работает в Bokeh. Но, по крайней мере, вы можете сохранить свой «прогресс» в своих исследованиях.

Upd1. Чтобы правильно показать кириллицу c, вы должны использовать следующий обратный вызов для FileInput:

    l.js_on_change('value', CustomJS(code="""
function b64DecodeUnicode(str) {
    // Going backwards: from bytestream, to percent-encoding, to original string.
    return decodeURIComponent(atob(str).split('').map(function(c) {
        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
    }).join(''));
}

const {Document} = Bokeh.require('document/document');
const data = JSON.parse(b64DecodeUnicode(cb_obj.value));
const doc = Document.from_json_string(data);
Bokeh.embed.add_document_standalone(doc, document.getElementById('document-container1'), [], true);
cb_obj.disabled = true;
"""))
...