Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bokeh: Models must be owned by only a single document

Tags:

bokeh

I'm working with Bokeh 0.12.2 in a Jupyter notebook and it frequently throws exceptions about "Models must be owned by only a single document":

---------------------------------------------------------------------------
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

The trigger is always calling show(...) (although never the first time after kernel start-up, only subsequent calls).

Based on the docs, I thought reset_output() would return my notebook to an operable state but the exception persists. Through trial-and-error, I've determined it's necessary to also re-define everything being passing to show(). That makes interactive work cumbersome and error-prone.

[Ref]:

reset_output(state=None)

  Clear the default state of all output modes.

  Returns: None


  • Am I right about reset_output() -- is it supposed to resolve the situation causing this exception?

  • Else, how do I avoid this kind of exception?

like image 305
patricktokeeffe Avatar asked Sep 27 '16 23:09

patricktokeeffe


2 Answers

It may be because of conflicting objects that has the same name. you need to create completely new objects every time.

like image 173
mooneral Avatar answered Nov 22 '22 13:11

mooneral


Seems it can by fixed by differentiating the source name Like this:

source1 = df
p1.circle('A', 'B', source=source1)

source2 = df
p2 = figure()
p2.circle('C', 'D', source=source2)

sourceN = df
p2 = figure()
p2.circle('X', 'Y', source=sourceN)
like image 40
Scorpioooooon21 Avatar answered Nov 22 '22 13:11

Scorpioooooon21