graphviz
Scannednpx machina-cli add skill johnlarkin1/claude-code-extensions/graphviz --openclawGraphViz DOT Generation
Generate graph descriptions using DOT language. GraphViz provides powerful automatic layout algorithms for complex graphs.
Quick Start
Minimal directed graph:
digraph G {
A -> B -> C;
}
Output Formats
- DOT file -
.dotextension for source - Rendered images - Use Bash to render:
dot -Tpng graph.dot -o graph.png dot -Tsvg graph.dot -o graph.svg dot -Tpdf graph.dot -o graph.pdf
Workflow
- Choose graph type -
digraph(directed) orgraph(undirected) - Define structure - Nodes and edges
- Apply attributes - Styling and layout hints
- Write file - Save as
.dot - Render (optional) - Convert to image format
Graph Types
Directed Graph (digraph)
digraph ProcessFlow {
rankdir=LR;
start [shape=circle, style=filled, fillcolor=green];
end [shape=doublecircle, style=filled, fillcolor=red];
start -> process1 -> decision;
decision -> process2 [label="yes"];
decision -> process3 [label="no"];
process2 -> end;
process3 -> end;
}
Undirected Graph (graph)
graph Network {
layout=neato;
overlap=false;
server [shape=box3d];
client1 -- server;
client2 -- server;
client3 -- server;
client1 -- client2 [style=dashed];
}
Common Patterns
Hierarchical Layout (Default)
digraph Hierarchy {
rankdir=TB;
node [shape=box];
CEO -> {VP1, VP2, VP3};
VP1 -> {M1, M2};
VP2 -> {M3, M4};
VP3 -> {M5, M6};
}
Dependency Graph
digraph Dependencies {
rankdir=LR;
node [shape=box, style=rounded];
app -> {libA, libB, libC};
libA -> {libD, libE};
libB -> libD;
libC -> libE;
}
State Machine
digraph StateMachine {
rankdir=LR;
node [shape=circle];
start [shape=point];
end [shape=doublecircle];
start -> idle;
idle -> running [label="start"];
running -> paused [label="pause"];
paused -> running [label="resume"];
running -> idle [label="stop"];
idle -> end [label="exit"];
}
Network Topology
graph Topology {
layout=fdp;
overlap=false;
splines=true;
subgraph cluster_dc1 {
label="Data Center 1";
style=dashed;
router1 [shape=box3d];
server1a, server1b;
}
subgraph cluster_dc2 {
label="Data Center 2";
style=dashed;
router2 [shape=box3d];
server2a, server2b;
}
internet [shape=cloud];
router1 -- server1a;
router1 -- server1b;
router2 -- server2a;
router2 -- server2b;
router1 -- internet;
router2 -- internet;
}
Record-Based Nodes (Structs)
digraph Structs {
node [shape=record];
struct1 [label="{Name|{Field1|Field2|Field3}}"];
struct2 [label="{<f0>Head|{<f1>Left|<f2>Right}}"];
struct2:f1 -> struct1;
struct2:f2 -> struct1;
}
Node Shapes
| Shape | Use Case |
|---|---|
box | Process, component |
ellipse | Default, general |
circle | State, small node |
doublecircle | Final state |
diamond | Decision |
record | Data structure |
Mrecord | Rounded record |
box3d | Server, database |
cylinder | Database |
folder | Directory |
note | Comment |
tab | Tab/window |
house | Home/start |
invhouse | Inverted house |
polygon | Custom (sides=N) |
point | Tiny/start point |
plaintext | Text only |
Edge Attributes
digraph Edges {
A -> B [label="labeled"];
A -> C [style=dashed];
A -> D [style=dotted];
A -> E [style=bold];
A -> F [color=red];
A -> G [penwidth=3];
A -> H [arrowhead=none];
A -> I [arrowhead=diamond];
A -> J [dir=both];
A -> K [constraint=false]; // Don't affect rank
}
Subgraphs and Clusters
digraph Clusters {
subgraph cluster_0 {
label="Cluster A";
style=filled;
color=lightgrey;
a0 -> a1 -> a2;
}
subgraph cluster_1 {
label="Cluster B";
color=blue;
b0 -> b1 -> b2;
}
a2 -> b0;
}
Note: Subgraphs named cluster_* are drawn as boxes.
Layout Engines
| Engine | Use Case |
|---|---|
dot | Hierarchical (default) |
neato | Spring model, undirected |
fdp | Force-directed |
sfdp | Large graph force-directed |
circo | Circular layout |
twopi | Radial layout |
Select via:
digraph G {
layout=neato;
// or use command: neato -Tpng graph.dot -o graph.png
}
Rendering Commands
# Basic PNG
dot -Tpng input.dot -o output.png
# SVG for web
dot -Tsvg input.dot -o output.svg
# PDF for documents
dot -Tpdf input.dot -o output.pdf
# High-resolution PNG
dot -Tpng -Gdpi=300 input.dot -o output.png
# Using different layout engine
neato -Tpng input.dot -o output.png
fdp -Tpng input.dot -o output.png
# Validate syntax
dot -Tcanon input.dot
# Debug layout
dot -v input.dot
Critical Rules
- Semicolons - Optional but recommended for clarity
- Quotes - Use for labels with spaces/special chars
- IDs - No spaces, or use quotes:
"Node Name" - Attributes - In square brackets:
[attr=value] - Cluster naming - Must start with
cluster_to be boxed - Edge syntax -
->for digraph,--for graph
When to Use GraphViz
- Complex dependency graphs
- Large graphs with many nodes
- Network topology diagrams
- State machines and automata
- When precise layout control is needed
- When rendering to image files is required
- Hierarchical structures (org charts, trees)
- When automatic layout is preferred over manual
References
See references/dot-syntax.md for complete attribute reference.
See references/layout-engines.md for detailed layout engine comparison.
Source
git clone https://github.com/johnlarkin1/claude-code-extensions/blob/main/plugins/diagram-code/skills/graphviz/SKILL.mdView on GitHub Overview
GraphViz DOT Generation enables creating DOT source for directed and undirected graphs, hierarchical layouts, and network diagrams. It supports rendering to PNG, SVG, or PDF and is ideal for complex layouts, clustering, ranking, and large graphs (100+ nodes).
How This Skill Works
Define a DOT description using digraph or graph, add nodes and edges with optional attributes to control layout, then save as a .dot file and render with GraphViz (dot) to PNG, SVG, or PDF.
When to Use It
- Need precise node positioning and advanced layout for a directed or undirected graph
- You must render the graph to PNG, SVG, or PDF for reports or documentation
- Working with large graphs (100+ nodes) or complex structures
- You want clustering, ranking, or hierarchical layouts (rankdir, subgraphs)
- Creating network diagrams, dependency graphs, or state machines with DOT
Quick Start
- Step 1: Write a DOT source using digraph (directed) or graph (undirected)
- Step 2: Define nodes and edges with optional attributes (shapes, labels, styles)
- Step 3: Save as .dot and render with dot -T<format> input.dot -o output.<format>
Best Practices
- Choose digraph or graph first and maintain consistency throughout the file
- Use layout attributes (e.g., rankdir, layout, splines) and descriptive node/edge attributes
- Organize related nodes with subgraphs/clusters to reflect real groups
- Label edges clearly and use meaningful node shapes for readability
- Validate DOT syntax and render iteratively to verify the layout
Example Use Cases
- Directed Process Flow: a digraph with rankdir and labeled transitions (ProcessFlow example)
- Network Topology: an undirected graph with clusters representing data centers
- Hierarchical Layout: a top-to-bottom organizational chart showing executive to managers
- Dependency Graph: a directed graph illustrating library dependencies
- State Machine: a directed diagram with start, idle, running, and end states