Get the FREE Ultimate OpenClaw Setup Guide →

graphviz

Scanned
npx machina-cli add skill johnlarkin1/claude-code-extensions/graphviz --openclaw
Files (1)
SKILL.md
6.3 KB

GraphViz 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

  1. DOT file - .dot extension for source
  2. 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

  1. Choose graph type - digraph (directed) or graph (undirected)
  2. Define structure - Nodes and edges
  3. Apply attributes - Styling and layout hints
  4. Write file - Save as .dot
  5. 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

ShapeUse Case
boxProcess, component
ellipseDefault, general
circleState, small node
doublecircleFinal state
diamondDecision
recordData structure
MrecordRounded record
box3dServer, database
cylinderDatabase
folderDirectory
noteComment
tabTab/window
houseHome/start
invhouseInverted house
polygonCustom (sides=N)
pointTiny/start point
plaintextText 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

EngineUse Case
dotHierarchical (default)
neatoSpring model, undirected
fdpForce-directed
sfdpLarge graph force-directed
circoCircular layout
twopiRadial 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

  1. Semicolons - Optional but recommended for clarity
  2. Quotes - Use for labels with spaces/special chars
  3. IDs - No spaces, or use quotes: "Node Name"
  4. Attributes - In square brackets: [attr=value]
  5. Cluster naming - Must start with cluster_ to be boxed
  6. 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

  1. Step 1: Write a DOT source using digraph (directed) or graph (undirected)
  2. Step 2: Define nodes and edges with optional attributes (shapes, labels, styles)
  3. 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

Frequently Asked Questions

Add this skill to your agents
Sponsor this space

Reach thousands of developers