Panel Matplotlib pane fails when interactive=True
ncvangilse opened this issue · comments
I was directed to file an issue here from https://discourse.holoviz.org/t/matplotlib-pane-throwing-attributeerror-when-interactive-true/2911
The minimal app:
import panel as pn
from matplotlib import pyplot as plt
fig, ax = plt.subplots()
ax.plot([0,1,2], [2,2,4])
pn.pane.plot.Matplotlib(fig, interactive=True).show()
works when
- ipykernel<6
- ipympl==0.7.0
- panel<=0.12.1
But I have discovered that even with these versions, the app crashes when the page is reloaded.
If I run it via docker, the panes displays correctly the first time the app spins up, but subsequent sessions will display horizontally squished panes:
where the first session dies with trace:
HTTPServerRequest(protocol='http', host='localhost:58471', method='GET', uri='/', version='HTTP/1.1', remote_ip='::1')
Traceback (most recent call last):
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\traitlets\traitlets.py", line 537, in get
value = obj._trait_values[self.name]
KeyError: 'layout'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\tornado\web.py", line 1704, in _execute
result = await result
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\panel\io\server.py", line 206, in get
session = await self.get_session()
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\bokeh\server\views\session_handler.py", line 120, in get_session
session = await self.application_context.create_session_if_needed(session_id, self.request, token)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\bokeh\server\contexts.py", line 218, in create_session_if_needed
self._application.initialize_document(doc)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\panel\io\server.py", line 172, in initialize_document
super().initialize_document(doc)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\bokeh\application\application.py", line 171, in initialize_document
h.modify_document(doc)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\bokeh\application\handlers\function.py", line 132, in modify_document
self._func(doc)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\panel\io\server.py", line 81, in _eval_panel
doc = as_panel(panel)._modify_doc(server_id, title, doc, location)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\panel\viewable.py", line 244, in _modify_doc
return self.server_doc(doc, title, location)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\panel\viewable.py", line 794, in server_doc
model = self.get_root(doc)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\panel\pane\base.py", line 265, in get_root
root = self._get_model(doc, comm=comm)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\panel\pane\plot.py", line 192, in _get_model
manager = self._get_widget(self.object)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\panel\pane\plot.py", line 178, in _get_widget
canvas = Canvas(fig)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\ipympl\backend_nbagg.py", line 163, in __init__
DOMWidget.__init__(self, *args, **kwargs)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\ipywidgets\widgets\widget.py", line 415, in __init__
self.open()
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\ipywidgets\widgets\widget.py", line 428, in open
state, buffer_paths, buffers = _remove_buffers(self.get_state())
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\ipywidgets\widgets\widget.py", line 518, in get_state
value = to_json(getattr(self, k), self)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\traitlets\traitlets.py", line 577, in __get__
return self.get(obj, cls)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\traitlets\traitlets.py", line 540, in get
default = obj.trait_defaults(self.name)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\traitlets\traitlets.py", line 1580, in trait_defaults
return self._get_trait_default_generator(names[0])(self)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\traitlets\traitlets.py", line 513, in default
return self.make_dynamic_default()
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\ipywidgets\widgets\trait_types.py", line 168, in make_dynamic_default
return self.klass(*(self.default_args or ()),
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\ipywidgets\widgets\widget.py", line 415, in __init__
self.open()
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\ipywidgets\widgets\widget.py", line 438, in open
self.comm = Comm(**args)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\ipykernel\comm\comm.py", line 57, in __init__
self.open(data=data, metadata=metadata, buffers=buffers)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\ipykernel\comm\comm.py", line 91, in open
self._publish_msg('comm_open',
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\ipykernel\comm\comm.py", line 66, in _publish_msg
self.kernel.session.send(self.kernel.iopub_socket, msg_type,
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\ipywidgets_bokeh\kernel.py", line 80, in send
self._trigger_change(event)
File "C:\Users\nchvg\Miniconda3\envs\optisoil-engineering-tools\lib\site-packages\ipywidgets_bokeh\kernel.py", line 103, in _trigger_change
self.document.callbacks.trigger_on_change(event)
AttributeError: 'Document' object has no attribute 'callbacks'
Should have updated the pins but latest ipywidgets_bokeh requires bokeh>2.4.
I tried the example with the latest version
bokeh 2.4.1
ipykernel 6.5.0
ipympl 0.8.2
ipywidgets-bokeh 1.2.1
matplotlib 3.4.3
panel 0.12.4
It now throws another error
import panel as pn
from matplotlib import pyplot as plt
FONTAWESOME_LINK = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.css"
pn.config.css_files.append(FONTAWESOME_LINK)
fig, ax = plt.subplots()
ax.plot([0,1,2], [2,2,4])
pn.pane.plot.Matplotlib(fig, interactive=True).show()
$ python 'snippets\script.py'
Launching server at http://localhost:51985
WARNING:tornado.access:404 GET /favicon.ico (::1) 1.00ms
ERROR:fake:Invalid Message
Traceback (most recent call last):
File "C:\repos\private\panel-visuals\.venv\lib\site-packages\ipykernel\kernelbase.py", line 312, in dispatch_shell
msg = self.session.deserialize(msg, content=True, copy=False)
File "C:\repos\private\panel-visuals\.venv\lib\site-packages\jupyter_client\session.py", line 1048, in deserialize
raise ValueError("Duplicate Signature: %r" % signature)
ValueError: Duplicate Signature: b'ddb25f037b3c018553a6441f9fd711c54e4c159ba478de1f5ac630117f72a267'
ERROR:fake:Invalid Message
....
Traceback (most recent call last):
File "C:\repos\private\panel-visuals\.venv\lib\site-packages\ipykernel\kernelbase.py", line 312, in dispatch_shell
msg = self.session.deserialize(msg, content=True, copy=False)
File "C:\repos\private\panel-visuals\.venv\lib\site-packages\jupyter_client\session.py", line 1048, in deserialize
raise ValueError("Duplicate Signature: %r" % signature)
ValueError: Duplicate Signature: b'400aa479fa9ab6a81aa652cb81b59f1b3e8870a9a863d78014879dd57855b86c'
ERROR:fake:Invalid Message
Traceback (most recent call last):
File "C:\repos\private\panel-visuals\.venv\lib\site-packages\ipykernel\kernelbase.py", line 312, in dispatch_shell
msg = self.session.deserialize(msg, content=True, copy=False)
File "C:\repos\private\panel-visuals\.venv\lib\site-packages\jupyter_client\session.py", line 1048, in deserialize
raise ValueError("Duplicate Signature: %r" % signature)
ValueError: Duplicate Signature: b'400aa479fa9ab6a81aa652cb81b59f1b3e8870a9a863d78014879dd57855b86c'
ERROR:fake:Invalid Message
Traceback (most recent call last):
File "C:\repos\private\panel-visuals\.venv\lib\site-packages\ipykernel\kernelbase.py", line 312, in dispatch_shell
msg = self.session.deserialize(msg, content=True, copy=False)
File "C:\repos\private\panel-visuals\.venv\lib\site-packages\jupyter_client\session.py", line 1048, in deserialize
raise ValueError("Duplicate Signature: %r" % signature)
ValueError: Duplicate Signature: b'400aa479fa9ab6a81aa652cb81b59f1b3e8870a9a863d78014879dd57855b86c'
WARNING:tornado.access:404 GET /static/extensions/ipywidgets_bokeh/06c52960c6d2c0312a3e.woff?v=4.7.0 (::1) 1.00ms
WARNING:tornado.access:404 GET /static/extensions/ipywidgets_bokeh/4c6f1cd9993ba8a53b8e.ttf?v=4.7.0 (::1)
1.00ms
The problem is also there if I downgrade ipykernel
to 5.5.6.
Hi, I was wondering if there is any update on this issue?
This should be resolved with latest Panel (0.13.0) and bokeh (2.4.2).
I run this with the latest versions of the tools and got inconsistent results. It was not producing reliable results on Mac and Linux, Chrome and Firefox, classic notebook and lab. What seems to work reliably is downgrading ipympl
to 0.7.0 and using a classic notebook.
That should have been resolved by panel 0.13. can you confirm what panel.__version__
reports?
yes, I can confirm my panel version is '0.13.0'