A brief introduction to Graphviz and DOT files syntax, which will undoubtedly grow as I do more advanced things with this powerful tool and as I get more bored with having to constantly look up information, especially as the website seems to be down more often that it is up.


As with all topics in this book, I’m not going to cover how to install Graphviz - it should be fairly straightforward.

What is Graphviz?

Graphviz, and the DOT file format, is a tool for creating visual diagrams based on textual descriptions of relationships. It can be used to show how things relate, or to create flowcharts, or network diagrams. More or less, anything that you might show with boxes and arrows is a good fit for Graphviz.

How to create a graph

Start by creating a new file, and use a file-ending of ‘.dot’. The basic structure you need to add to the file is

digraph {


you can name your graph, by simply adding a name after the graph type.

digraph NAME {


Graphs named G seem to be common. This doesn’t seem to do much, so you can safely ignore it. You might see this in diagrams.

there are other types other than digraph, such as graph.

graph digraph

graphs have attributes

Things that appear in a graph are called nodes. A basic graph with a node is

graph {

You can add many nodes and connect them with lines or arrows.

graph {
    a -- b;
    c -> d;

double dash creates a line, and -> creates an arrow.

Styling nodes

adding square brackets after a node allows you to set attributes.

a [shape=box]

creating a node named ‘node’ allows you to set global properties.

node [shape=box]

you can control the shape, and fill properties.

node [shape=box style="filled,rounded" fillcolor=yellow]

This will make rounded boxes filled with yellow. All nodes following this declaration will have these attributes.

Common attributes

Some attributes appear a lot and cover most of the changes from the defaults that you are likely to need.


My favourites are box and note. Circle box3d are handy too.


Font size in points. Start with 10 and adjust as needed.


Different shapes have style options. Most have ‘filled’ and box shapes have ‘rounded’ to take the edges off the corners.


You can set a colour for the shape. For example; yellow, lightblue, grey, and so on.


This allows the typeface to change, for example you can use ‘Verdana’.


If you set the label attribute, it will show this text instead of the node name.

thing [label="This is a Thing"]

lines / arrows are called edges, and edges are labelled when they are added to the graph

acorn -> mightyoaktree [label="grows into"]

multiple lines are possible by adding line break control codes.

item [label="A\nLabel\nwith\nmany\nlines"]

It’s not the easiest to read in the source code, but this is how it’s done in many other languages, including C, Java, and in shell scripts so this should be familiar to most developers.

Rendering a DOT file.

You can get an image from a dot file

dot -Tpng > mygraph.png

Will give you a PNG image. There are other output types.


we didn’t install Graphviz We created a new graph we discussed graph types we styled things to look how we wanted them to we rendered a png from a .dot file

what we didn’t cover... subgraphs errors all the different shape types all the attributes installation rank=sink