我正在使用Jupyter笔记本中的Bokeh 0.12.2,并经常抛出"模型必须只由一个文档拥有"的例外情况:
---------------------------------------------------------------------------
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
Run Code Online (Sandbox Code Playgroud)
触发器总是在调用show(...)(虽然从来没有在内核启动后第一次只调用后续调用).
根据文档,我认为reset_output()会将我的笔记本恢复到可操作状态,但异常仍然存在.通过反复试验,我已经确定有必要重新定义要传递的所有内容show().这使得交互式工作变得麻烦且容易出错.
[ 参考 ]:
reset_output(状态=无)
清除所有输出模式的默认状态.
返回: 无
我是对的reset_output()- 是否应该解决导致此异常的情况?
否则,我该如何避免这种异常?
小智 5
我一直在使用 jupyterlab 笔记本使用散景、全息视图和面板迭代大量数据的可视化,并且定期遇到此问题。
以下是一些可能有帮助的其他事项。请注意,它p用作图形的散景常规名称。我在这个旧线程上发帖是因为它是我在 Google 搜索错误消息时的最高结果。
尝试清除文档(在docs中找到):
from bokeh.io import curdoc
curdoc().clear()
Run Code Online (Sandbox Code Playgroud)
我观察到,即使散景显示不能显示散景对象,面板也能够显示散景对象。
import panel as pn
pn.extension()
pn.pane.Bokeh(p)
Run Code Online (Sandbox Code Playgroud)
深入研究面板如何能够在散景不显示的情况下显示对象,我注意到这个函数,它解决了我的问题:
import panel as pn
pn.io.model.remove_root(p)
Run Code Online (Sandbox Code Playgroud)
如果您没有安装面板,这里是上面的源代码:
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)
Run Code Online (Sandbox Code Playgroud)
希望这对某人或未来的我有帮助。
| 归档时间: |
|
| 查看次数: |
4875 次 |
| 最近记录: |