Jupyter anywidget
for rendering diagrams from .dot
language to SVG using Graphviz Wasm (hpcc-systems/hpcc-js-wasm
).
Install as:
pip install jupyter_anywidget_graphviz
This runs in a browser based Jupyter environment and uses the browser machinery to run the wasm application.
# Import package
from jupyter_anywidget_graphviz import graphviz_headless, graphviz_panel, graphviz_inline
# Create a headless widget
# - works in: Jupyter Lab, Jupyter Notebook, VS Code
g = graphviz_headless()
# Inline mode
# Preview output as cell output from initialising cell
# - works in: Jupyter Lab, Jupyter Notebook, VS Code
# g = graphviz_inline()
# Create a widget panel with a handle
# - uses jupyter sidecar (Jupyter Lab only)
#g = graphviz_panel()
# Load magic
%load_ext jupyter_anywidget_graphviz
We can now write dot
code in a magicked code cell (%%graphviz_magic WIDGET_HANDLE
):
%%graphviz_magic -w g
strict graph {
a -- b
a -- b
b -- a [color=blue]
}
The -w / --widget-name
setting can be used to set the widget within the magic and it does not need to be passed again.
The widget can also be set via line magic: %setwidget g
The output is previewed in the UI panel, if rendered.
Retrieve the SVG diagram as WIDGET_HANDLE.svg
.
We can display the diagram in the notebook e.g. as:
from IPython.display import SVG
SVG(g.svg)
In its base form, the way the Jupyter event loop runs means we canlt directly generate an output from the magic cell. However, setting the -e/--embed
flag, or setting a timeout -t/--timeout SECONDS
(default 5s), we can force a blocking action on the cell that waits for the asynchronous graphviz object to return the gernerated SVG, and then render it.
The .blocking_reply()
method on the object will also block until the response status is set to completed.
viz.js [repo] also seems to offer in browser graphviz rendering. KrunkZhou/jupyterlab-viz-krunk
is a JupyterLab extension (untested) that seems to support backticked ```graphviz
blocks in markdown cells.
Here'a an alternative anywidget
using the same graphviz
wasm package from @basnijholt: https://github.com/pipefunc/graphviz-anywidget
See the GitHup topc tag: jupyter-wasm-anywidget-extension