This packages provides a server for the bokehjs libary:
- It allows creating plots in a notebook cell and updating them in another.
- It also allows publishing web apps, just as Bokeh does.
The package relies extensively on the Bokeh library. The latter is a python web server together with a javascript client. This package rewrites the python server in julia and reuses the javascript part as is. This package's API is loosely similar to its python counterpart.
The Plots
package provides multiple backends. We created our own:
using Plots
using BokehServer
bokeh()
plot([1, 2])
Examples are available in the examples directory. One such one would be
using BokehServer
BokehServer.Plotting.serve() do
fig = BokehServer.figure(x_axis_label = "time", y_axis_label = "energy")
y = rand(1:100, 100)
BokehServer.line!(fig; y, color = :blue)
BokehServer.scatter!(fig; y, color = :red)
fig
end
** Note ** Within a notebook, one needs a cell to return BokehServer.Embeddings.notebook()
for plots to be displayed and typescript <-> julia synchronisation to occur:
In the first cell, do:
using BokehServer
BokehServer.Embeddings.notebook(port = 7788)
Then another can contain
"A simple plot"
FIG = BokehServer.line(; x = 1:10, y = 1:10)
"The data source used by the plot"
DATA = FIG.renderers[1].data_source
"A button which adds a datapoint when clicked"
BTN = let btn = BokehServer.Button(; label = "add a data point")
# Note that the `onchange` call only reacts to `ButtonClick` events
BokehServer.onchange(btn) do evt::BokehServer.ButtonClick
BokehServer.stream!(
DATA,
Dict("x" => [length(DATA.data["x"])+1], "y" => [rand(1:10)])
)
end
btn
end
"A display with both the plot and the button"
BokehServer.layout([FIG, BTN])
- This package provdes all models already existing in Bokeh and bokehjs. This is done by programmatically parsing the python Bokeh and creating our own code. Hopefully further Bokeh versions will not affect this too much.
- This package should work out-of-the-box both with
IJulia
andPluto
. - Because
end
is a julia keyword, all class attributes starting withend
in Bokeh start withfinish
in BokehServer. The protocol hides this from the bokehjs library. - This package does not yet have a mechanism for adding custom classes with their typescript code.
- This package does not deliver a full web server. There is no authentification mechanism, for example. The package does provide routes and a bare-bone web server. The idea is rather to have users add the routes to their own server rather than use this package's.
- This package does not provide a
bokeh
executable. Rather, the user should callBokehServer.Plotting.server(f)
wheref
must return theBokehServer
layout instance, say one plot. Check the doc onBokehServer.serve
for other options.
Another bokeh in julia is the same idea, created more or less at the same time. To the best of my understanding, with my appologies if I'm wrong, it does not provide Julia <-> javascript synchronisation: static HTML pages only.