Один из способов сделать это в Bokeh v1.1.0 - прикрепить обратный вызов к атрибуту data
ColumnDataSource
:
import numpy as np
from bokeh.plotting import Figure, show, curdoc
from bokeh.models import CustomJS, ColumnDataSource, Button, Column
from bokeh.events import Tap
cds = ColumnDataSource(data = dict(x = [0.1, 0.9], y = [0.1, 0.9]))
p = Figure(x_range = (0, 1), y_range = (0, 1), tools = "")
p.scatter(x = 'x', y = 'y', source = cds)
data = dict(x = [0.5], y = [0.5])
callback = CustomJS(args = {'cds': cds, 'data': data}, code = "cds.data = data")
button = Button(label = 'click me')
button.js_on_event('button_click', callback)
cds.js_on_change('data', CustomJS(code = "alert('data_change_detected');"))
show(Column(p, button))