散景:模型必须只由一个文档拥有

时间:2016-09-27 23:11:52

标签: bokeh

我在Jupyter笔记本中使用Bokeh 0.12.2并经常抛出关于&#34的例外;模型必须仅由一个文档拥有":

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-23-f50ac7abda5e> in <module>()
      2     ea.legend.label_text_font_size = '10pt'
      3 
----> 4 show(column([co2, co, nox, o3]))

C:\Users\pokeeffe\AppData\Local\Continuum\Anaconda3\lib\site-packages\bokeh\io.py in show(obj, browser, new, notebook_handle)
    308     '''
    309     if obj not in _state.document.roots:
--> 310         _state.document.add_root(obj)
    311     return _show_with_state(obj, _state, browser, new, notebook_handle=notebook_handle)
    312 

C:\Users\pokeeffe\AppData\Local\Continuum\Anaconda3\lib\site-packages\bokeh\document.py in add_root(self, model)
    443             self._roots.append(model)
    444         finally:
--> 445             self._pop_all_models_freeze()
    446         self._trigger_on_change(RootAddedEvent(self, model))
    447 

C:\Users\pokeeffe\AppData\Local\Continuum\Anaconda3\lib\site-packages\bokeh\document.py in _pop_all_models_freeze(self)
    343         self._all_models_freeze_count -= 1
    344         if self._all_models_freeze_count == 0:
--> 345             self._recompute_all_models()
    346 
    347     def _invalidate_all_models(self):

C:\Users\pokeeffe\AppData\Local\Continuum\Anaconda3\lib\site-packages\bokeh\document.py in _recompute_all_models(self)
    367             d._detach_document()
    368         for a in to_attach:
--> 369             a._attach_document(self)
    370         self._all_models = recomputed
    371         self._all_models_by_name = recomputed_by_name

C:\Users\pokeeffe\AppData\Local\Continuum\Anaconda3\lib\site-packages\bokeh\model.py in _attach_document(self, doc)
     89         '''This should only be called by the Document implementation to set the document field'''
     90         if self._document is not None and self._document is not doc:
---> 91             raise RuntimeError("Models must be owned by only a single document, %r is already in a doc" % (self))
     92         doc.theme.apply_to_model(self)
     93         self._document = doc

RuntimeError: Models must be owned by only a single document, <bokeh.models.tickers.DaysTicker object at 0x00000000042540B8> is already in a doc

触发器始终调用show(...)(尽管从未在内核启动后第一次,只有后续调用)。

根据文档,我认为reset_output()会将笔记本恢复到可操作状态,但异常仍然存在。通过反复试验,我确定有必要重新定义传递给show()的所有内容。这使得交互式工作变得麻烦且容易出错。

[Ref]:

  

reset_output(状态=无)

     

清除所有输出模式的默认状态。

     

退货:

  • 我是否正确reset_output() - 是否应该解决导致此异常的情况?

  • 否则,我该如何避免这种例外?

6 个答案:

答案 0 :(得分:3)

升级到bokeh版本1.01后,使用来自bokeh.embed的file_html时遇到了此错误消息。再次降级为bokeh版本0.12.16解决了该问题。 (pip install bokeh == 0.12.16) 注意为什么。

答案 1 :(得分:2)

可能是因为具有相同名称的冲突对象。你需要每次都创建全新的对象。

答案 2 :(得分:1)

似乎可以通过区分源名称来解决 像这样:

<?php
       foreach ($hospitals as $hospital) {
          echo "<label>";
          echo $this->Form->checkbox('hospitals', ['value'=>$hospital->id]); 
          echo $hospital->name. "</label>";
       }
?> 

答案 3 :(得分:0)

创建每个后,请尝试使用:

    curdoc().add_root(column([figure]))
    curdoc().title = doc_title
    output_file('file_name.html')
    show(figure)

答案 4 :(得分:0)

此解决方案无需升级或降级软件包即可工作。

try:
    reset_output()
    output_notebook()
    show(p)
except:
    output_notebook()
    show(p)

此处提供的解决方案:

https://github.com/bokeh/bokeh/issues/8579

答案 5 :(得分:0)

我一直在使用 jupyterlab notebook 迭代使用散景、全息视图和面板对大量数据进行可视化,并定期遇到此问题。

这里有一些额外的东西可能会有所帮助。请注意,p 用作该图的散景常规名称。我在这个旧线程上发帖是因为它是我在 Google 中搜索错误消息的最高结果。

尝试清除文档(在 docs 中找到):

from bokeh.io import curdoc

curdoc().clear()

我观察到 panel 能够显示散景对象,即使散景显示无法显示。

import panel as pn

pn.extension()

pn.pane.Bokeh(p)

深入研究面板如何在没有散景的情况下显示对象,我注意到这个 function,它为我解决了这个问题:

import panel as pn

pn.io.model.remove_root(p)

如果您没有安装面板,这里是上面的源code

from bokeh.models import Model

for model in p.select({'type': Model}):
    prev_doc = model.document
    model._document = None
    if prev_doc:
        prev_doc.remove_root(model)

希望这对某人或未来的我有所帮助。