Generate and render Graphviz diagrams with clear, maintainable code by separating presentation from structure.
The heart of gvdot is the class Dot, a DOT language builder. Applications
create diagrams using Dot methods, then either convert the instance to DOT
language text or render it as SVG or an image. Users can also interactively
display Dot objects in notebooks.
Example
Suppose we want to generate diagrams of nondeterministic finite automata like this:
represented by instances of
@dataclass
class NFA:
alphabet : str
delta : dict[str, list[list[str]]]
final : list[str]
start : str
where delta["q"][0] is the list of states reached from state q by epsilon
transitions, and delta["q"][i] is the list of states reached from q by
symbol alphabet[i-1].
We start by defining a theme, a normal Dot object from which other dot
objects can inherit graph attributes, default attributes, and roles.
nfa_theme = (Dot()
.all_default(fontsize=12)
.node_default(shape="circle", style="filled", fillcolor="khaki")
.node_role("init", label="", shape="none", width=0, height=0)
.node_role("final", shape="doublecircle", penwidth=1.25)
.graph(rankdir="LR", labelloc="t", fontsize=16))
The theme defines two gvdot roles, collections of Graphviz attribute values that applications can assign to diagram elements by name.
Having isolated presentation attributes in a theme, our generation code is straightforward.
def nfa_diagram(nfa:NFA, title:str):
dot = Dot(directed=True).use_theme(nfa_theme)
dot.graph(label=Markup(f"<b>{title}</b>"))
init_id = Nonce()
dot.node(init_id, role="init")
dot.edge(init_id, nfa.start)
for state in nfa.final:
dot.node(state, role="final")
for state, transitions in nfa.delta.items():
merged = defaultdict(list)
for index, targets in enumerate(transitions):
for target in targets:
merged[target].append(
nfa.alphabet[index-1] if index > 0 else 'ε')
for target, symbols in merged.items():
dot.edge(state, target, label=", ".join(symbols))
return dot
We can render and save the diagram above with
example = NFA("01", {
"s0": [["q0", "r0"], [], []],
"q0": [[], ["q1"], ["q0"]],
"q1": [[], ["q1"], ["q2"]],
"q2": [[], ["q3"], ["q0"]],
"q3": [[], ["q1"], ["q4"]],
"q4": [[], ["q4"], ["q4"]],
"r0": [[], ["r0"], ["r1"]],
"r1": [[], ["r0"], ["r2"]],
"r2": [[], ["r3"], ["r1"]],
"r3": [[], ["r3"], ["r3"]],
}, ["q4","r0","r1","r2"], "s0")
nfa_diagram(example,"Example NFA").save("example.svg")
In a notebook, we can directly display the diagram from a cell containing
nfa_diagram(example,"Example NFA").show()
You can find this NFA example and others in the examples directory. The documentation includes a Quick Tour
Installation
Using Python 3.12 or greater, you can install gvdot with
$ pip install gvdot
To ensure the optional notebook support is enabled, use
$ pip install gvdot[ipython]
Rendering
requires a Graphviz installation. You can determine if one is in your PATH
with
$ dot -V
To install Graphviz, see https://graphviz.org/download.
Reliability
gvdot includes automated tests with 100% code coverage, which are run on MacOS, Linux, and Windows with Python 3.12, 3.13, 3.14, and 3.15. See the GitHub workflow for details.
Metadata
Release files for gvdot 1.2.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| gvdot-1.2.4.tar.gz | 18.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gvdot-1.2.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 37.4 kB
Release files / gvdot-1.2.4.tar.gz
| Download URL | gvdot-1.2.4.tar.gz |
|---|---|
| Size | 18.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8306963bbb364319e301cede10b7dfdb91f21e5aec005452bfdeb5b5adcdbd5a
|
|
BLAKE2b-256 checksum How to use checksums |
a11df42249e0fbbfb9c7643e8b017c080cdfdb9b6c35755e2c168865bfc741ba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|
Release files / gvdot-1.2.4-py3-none-any.whl
| Download URL | gvdot-1.2.4-py3-none-any.whl |
|---|---|
| Size | 18.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7cc20aeb9483e521ab26083976769a52b7547576fba4e8b8a50f39ddd50737eb
|
|
BLAKE2b-256 checksum How to use checksums |
66d4ab715bcbf7f9ace9cf249b1c96d894c1811aa6b46a5e7a70002a66c1dca7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|