I have an implementation of a Bokeh plot in panel where I pass the class some ColumnDataSource
s, which are used to render the graph. The behavior I want is when I change these source’s data, the graph updates. I’m using the ColumnDataSource.on_change
for this and I’m finding differences between jupyter notebook and pn.serve, where it doesnt work in jupyter notebook but does when I’m using pn.serve
My code for running in jupyter notebooks:
import panel as pn
import param
import numpy as np
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource
pn.extension()
class BKFigure(param.Parameterized):
do_stuff = param.Action(lambda self: self._new_data())
def __init__(self, sources, *args, **params):
self.figure = figure()
super(BKFigure, self).__init__(*args, **params)
self.sources = sources
self.bk_pane = pn.pane.Bokeh(self.figure, sizing_mode='stretch_both')
for source in sources.values():
self.figure.line('x', 'y', source=source)
source.on_change('data', self._on_change_callback)
def _new_data(self):
"""mock function to emulate data changing somewhere"""
print('new data')
src = self.sources['line1']
src.data.update({'y': np.random.normal(20, 1, 200)})
#self.bk_pane.param.trigger('object') # Triggering the bokeh panel here DOES work while in jupyter notebooks
def _on_change_callback(self, attr, old, new):
self.bk_pane.param.trigger('object')
def panel(self):
return pn.Row(self.param, self.bk_pane)
x = np.arange(200)
y = np.random.normal(4, 1, 200)
dic = {'x': x, 'y': y}
cds = ColumnDataSource(dic)
y = np.random.normal(6, 1, 200)
dic = {'x': x, 'y': y}
cds1 = ColumnDataSource(dic)
sources = {'line1': cds, 'line2': cds1}
rf = BKFigure(sources)
out = rf.panel()
out
Where if I uncomment the commented out line it does update, and I can verify that the callback does get called while in jupyter notebooks. When I change to pn.serve(out)
everything works fine.
Does anyone know what could be reason for this difference?
My jupyter notebooks runs on python 3.6 and the kernel for my notebook is python 3.7 with:
bokeh 2.1.1 py37_0
holoviews 1.13.3 py_0
ipykernel 5.3.0 py37h5ca1d4c_0 conda-forge
ipython 7.16.1 py37h43977f1_0 conda-forge
panel 0.9.7 py_0 pyviz
param 1.9.3 py_0 pyviz
pyviz_comms 0.7.5 py_0 pyviz