DOT(1)
okay bestie, welcome to DOT(1) from the General Commands Manual โ aka the graph-drawing manual that has way more range than people give it credit for. This is the whole graphviz crew: dot, neato, twopi, circo, fdp, sfdp, patchwork, and osage, all living their best lives and mostly sharing the same command-line options. ๐
๐ NAME ๐
dotโ filter for drawing directed graphsneatoโ filter for drawing undirected graphstwopiโ filter for radial layouts of graphscircoโ filter for circular layout of graphsfdpโ filter for drawing undirected graphssfdpโ filter for drawing large undirected graphspatchworkโ filter for squarified tree mapsosageโ filter for array-based layouts
โจ SYNOPSIS โจ
dot [options] [files]
neato [options] [files]
twopi [options] [files]
circo [options] [files]
fdp [options] [files]
sfdp [options] [files]
patchwork [options] [files]
osage [options] [files]
๐ฆ DESCRIPTION ๐ฆ
These are a collection of programs for drawing graphs. Plot twist: there is actually only one main program; the specific layout algorithms are implemented as plugins. So yeah, they largely share all of the same command-line options. Slay, modularity.
dot draws directed graphs. It works well on directed acyclic graphs and other graphs that can be drawn as hierarchies or have a natural โflow.โ Main character energy for DAGs, honestly.
neato draws undirected graphs using a โspringโ model and reducing the related energy (see Kamada and Kawai, Information Processing Letters 31:1, April 1989).
twopi draws graphs using a radial layout (see G. Wills, Symposium on Graph Drawing GD'97, September, 1997). Basically, one node is chosen as the center and put at the origin. The remaining nodes are placed on a sequence of concentric circles centered about the origin, each a fixed radial distance from the previous circle. All nodes distance 1 from the center are placed on the first circle; all nodes distance 1 from a node on the first circle are placed on the second circle; and so forth. Itโs giving ripples in a pond, but make it graph theory.
circo draws graphs using a circular layout (see Six and Tollis, GD '99 and ALENEX '99, and Kaufmann and Wiese, GD '02.) The tool identifies biconnected components and draws the nodes of the component on a circle. The block-cutpoint tree is then laid out using a recursive radial algorithm. Edge crossings within a circle are minimized by placing as many edges on the circleโs perimeter as possible. In particular, if the component is outerplanar, the component will have a planar layout. If a node belongs to multiple non-trivial biconnected components, the layout puts the node in one of them. By default, this is the first non-trivial component found in the search from the root component. Circle girlies, this oneโs for you.
fdp draws undirected graphs using a โspringโ model. It relies on a force-directed approach in the spirit of Fruchterman and Reingold (cf. Software-Practice & Experience 21(11), 1991, pp. 1129-1164).
sfdp also draws undirected graphs using the โspringโ model described above, but it uses a multi-scale approach to produce layouts of large graphs in a reasonably short time. Big graph? No problem, bestie.
patchwork draws the graph as a squarified treemap (see M. Bruls et al., โSquarified treemapsโ, Proc. Joint Eurographics and IEEE TCVG Symp. on Visualization, 2000, pp. 33-42). The clusters of the graph are used to specify the tree. Nested boxes, but make it aesthetic.
osage draws the graph using its cluster structure. For a given cluster, each of its subclusters is laid out internally. Then the subclusters, plus any remaining nodes, are repositioned based on the clusterโs pack and packmode attributes. Cluster choreography, fr fr.
๐ OUTPUT FORMATS ๐
Graphviz uses an extensible plugin mechanism for its output renderers, so to see what output formats your installation of dot supports you can use dot -T: and check the warning message. Also, the plugin mechanism supports multiple implementations of the output formats, allowing variations in the renderers and formatters. To see what variants are available for a particular output format, use, for example: dot -Tpng: and to force a particular variant, use, for example: dot -Tpng:gd. Plugin peek behind the curtain, iykyk.
Traditionally, Graphviz supports the following:
-Tdot(Dot format containing layout information),-Txdot(Dot format containing complete layout information),-Tps(PostScript),-Tpdf(PDF),-Tsvg-Tsvgz(Structured Vector Graphics),-Tfig(XFIG graphics),-Tpng(png bitmap graphics),-Tgif(gif bitmap graphics),-Tjpg-Tjpeg(jpeg bitmap graphics),-Tjson(xdot information encoded in JSON),-Timap(imagemap files for httpd servers for each node or edge that has a non-nullhrefattribute.),-Tcmapx(client-side imagemap for use in html and xhtml).
Additional less common or more special-purpose output formats can be found at https://www.graphviz.org/doc/info/output.html.
Alternative plugins providing support for a given output format can be found from the error message resulting from appending a ':' to the format. e.g. -Tpng: The first plugin listed is always the default.
The -P switch can be used to produce a graph of all output variants supported by plugins in the local installation of graphviz. Lowkey a whole plugin family tree.
๐ GRAPH FILE LANGUAGE ๐
Here is a synopsis of the graph file language, normally using the extension .gv, for graphs:
[strict] (graph|digraph) name { statementโlist }
is the top-level graph. If the graph is strict, then multiple edges are not allowed between the same pairs of nodes. If it is a directed graph, indicated by digraph, then the edgeop must be "->". If it is an undirected graph then the edgeop must be "--". Strict means no messy duplicate edges, periodt.
Statements may be:
name=val;
node [name=val];
edge [name=val];
Set default graph, node, or edge attribute name to val. Any subgraph, node, or edge appearing after this inherits the new default attributes.
n0 [name0=val0,name1=val1,...];
Creates node n0 (if it does not already exist) and sets its attributes according to the optional list.
n0 edgeop n1 edgeop ... edgeop nn [name0=val0,name1=val1,...];
Creates edges between nodes n0, n1, ..., nn and sets their attributes according to the optional list. Creates nodes as necessary.
[subgraph name] { statementโlist }
Creates a subgraph. Subgraphs may be used in place of n0, ..., nn in the above statements to create edges. [subgraph name] is optional; if missing, the subgraph is assigned an internal name. Subgraphs really said โname optional, drama mandatory.โ
The language accepts both C-style comments /*C...*/ or //...
Attribute names and values are ordinary (C-style) strings. The following sections describe attributes that control graph layout.
A more complete description of the language can be found at https://www.graphviz.org/doc/info/lang.html.
๐ง GRAPH, NODE AND EDGE ATTRIBUTES ๐ง
Graphviz uses the name=value attributes, attached to graphs, subgraphs, nodes and edges, to tailor the layout and rendering. We list the more prominent attributes below. The complete list is available at https://www.graphviz.org/doc/info/attrs.html. This is the customization era and we are living in it.
๐ธ Attributes Common to Nodes, Edges, Clusters and Graphs ๐ธ
href=urlโ the default url for image map files; in PostScript files, the base URL for all relative URLs, as recognized by Acrobat Distiller 3.0 and up.URL=urlโ (โURLโ is a synonym for โhref.โ)fontcolor=colorvalueโ sets the label text color.- A
colorvaluemay be"h,s,v"(hue, saturation, brightness) floating point numbers between 0 and 1, or an X11 color name such as white, black, red, green, blue, yellow, magenta, or cyan, or a"#rrggbb"(red, green, blue, 2 hex characters each) value. Seehttps://www.graphviz.org/doc/info/attrs.html#k:colorandhttps://www.graphviz.org/doc/info/colors.htmlfor further details. Color theory but make it hexadecimal. fontsize=nโ sets the label type size tonpoints.fontname=nameโ sets the label font family name.label=textโ wheretextmay include escaped newlines\n,\l, or\rfor center, left, and right justified lines. The string'\G'value will be replaced by the graph name. For node labels, the string'\N'value will be replaced by the node name. For edges, if the substring'\T'is found in a label, it will be replaced by the name of the tail node; if the substring'\H'is found in a label, it will be replaced by the name of the head node; if the substring'\E'value is found in a label it will be replaced by:tail_node_name->head_node_nameor by:tail_node_name--head_node_namefor undirected graphs. The label escapes are doing the absolute most, and honestly? Respect.- Graphviz also supports special HTML-like labels for constructing complex node content. A full-description of these is given at
https://www.graphviz.org/doc/info/shapes.html#html. - If a node has
shape=record, the label may contain recursive box lists delimited by{ | }. Port identifiers in labels are set off by angle brackets< >. Record shapes are little nested box universes, no cap.
๐ GRAPH ATTRIBUTES ๐
okay bestie, these are the graph-level attrs โ the main-character settings for the whole diagram ๐ keep the names and values exactly as written, no cap.
size="x,y"โ specifies the maximum bounding box of the drawing in inches.ratio=fโ sets the aspect ratio tof, which may be a floating point number, or one of the keywordsfill,compress, orauto.layout=engineโ indicates the preferred layout engine (dot,neato,fdp, etc.), overriding the default from the basename of the command or the-Kcommandline option.margin=fโ sets the page margin (included in the page size).ordering=outโ constrains order of out-edges in a subgraph according to their file sequence.rotate=90โ sets landscape mode. (orientation=landis backward compatible but obsolete.)center=nโ a non-zero value centers the drawing on the page.color=colorvalueโ sets foreground color (bgcolorfor background).overlap=modeโ this specifies what algorithm should do if any nodes overlap. Ifmodeisfalse, the program uses the Prism algorithm to adjust the nodes to eliminate overlaps. Ifmodeisscale, the layout is uniformly scaled up, preserving node sizes, until nodes no longer overlap. The latter technique removes overlaps while preserving symmetry and structure, while the former removes overlaps more compactly but destroys symmetries. Ifmodeistrue(the default), no repositioning is done. Since thedotalgorithm always produces a layout with no node overlaps, this attribute is only useful with other layouts.stylesheet="file.css"โ includes a reference to a stylesheet in-Tsvgand-Tsvgzoutputs. Ignored by other formats.splinesโ if set totrue, edges are drawn as splines. If set topolyline, edges are drawn as polylines. If set toortho, edges are drawn as orthogonal polylines. In all of these cases, the nodes must not overlap. Ifsplines=falseorsplines=line, edges are drawn as line segments. The default istruefordot, andfalsefor all other layouts.
๐ฏ (dot-specific attributes) ๐ฏ
nodesep=fโ sets the minimum separation between nodes.ranksep=fโ sets the minimum separation between ranks.rankdir=LR|RL|BTโ requests a left-to-right, right-to-left, or bottom-to-top, drawing.rank=same(orminormax) โ in a subgraph, constrains the rank assignment of its nodes. If a subgraphโs name has the prefixcluster, its nodes are drawn in a distinct rectangle of the layout. Clusters may be nested.
๐ (neato-specific attributes) ๐
mode=valโ algorithm for minimizing energy in the layout. By default,neatouses stress majorization. Ifmode=KK, it uses a version of gradient descent.model=valโ theneatomodel computes the desired distances between all pairs of vertices. By default, it uses the length of the shortest path. Ifmodelis set tocircuit, a circuit-resistance model is used. Ifmodelis set tosubset, it uses a model whereby the edge length is the number of nodes that are neighbors of exactly one of the edgeโs vertices.start=valโ requests random initial placement and seeds the random number generator. Ifvalis not an integer, the process ID or current time is used as the seed.epsilon=nโ sets the cutoff for the solver. The default is0.1.
๐ (twopi-specific attributes) ๐
root=ctrโ this specifies the node to be used as the center of the layout. If not specified,twopiwill randomly pick one of the nodes that are furthest from a leaf node, where a leaf node is a node of degree1. If no leaf nodes exist, an arbitrary node is picked as center.ranksep=valโ specifies the radial distance in inches between the sequence of rings. The default is0.75.
๐ (circo-specific attributes) ๐
root=nodenameโ specifies the name of a node occurring in the root block. If the graph is disconnected, therootnode attribute can be used to specify additional root blocks.mindist=valueโ sets the minimum separation between all nodes. If not specified thencircouses a default value of1.0.
๐ซ (fdp-specific attributes) ๐ซ
K=valโ sets the default ideal node separation in the layout.maxiter=valโ sets the maximum number of iterations used to layout the graph.start=valโ adjusts the random initial placement of nodes with no specified position. Ifvalis an integer, it is used as the seed for the random number generator. Ifvalis not an integer, a random system-generated integer, such as the process ID or current time, is used as the seed.
๐ NODE ATTRIBUTES ๐
now weโre talking about the little icons themselves โ the nodes, the main characters of the graph ๐ซถ
height=dorwidth=dโ sets minimum height or width. Addingfixedsize=trueforces these to be the actual size (text labels are ignored).shapeโ can bebuiltin_polygon,record, orepsf.builtin_polygoncan be such values asplaintext,ellipse,oval,circle,egg,triangle,box,diamond,trapezium,parallelogram,house,hexagon,octagon,note,tab,box3d, orcomponent,,, among others. (Polygons are defined or modified by the following node attributes:regular,peripheries,sides,orientation,distortionandskew.)epsfuses the nodeโsshapefileattribute as the path name of an external EPSF file to be automatically loaded for the node shape.color=colorvalueโ sets the outline color, and the default fill color ifstyle=filledandfillcoloris not specified.fillcolor=colorvalueโ sets the fill color whenstyle=filled. If not specified, thefillcolorwhenstyle=filleddefaults to be the same as the outline color.styleโ can befilled,solid,dashed,dotted,bold,invis.xlabel="text"โ specifies a label that will be placed near, but outside, of a node. The normal label string is placed within the node shape.target="target"โ is a target string for client-side imagemaps and SVG, effective when nodes have a URL. The target string is used to determine which window of the browser is used for the URL. Setting it to"_graphviz"will open a new window if it doesnโt already exist, or reuse it if it does. If the target string is empty, the default, then notargetattribute is included in the output. The substrings\Nand\Gare substituted in the same manner as for the nodelabelattribute. Additionally the substring\Lis substituted with the node label string.tooltip="text"โ is a tooltip string for client-side imagemaps and SVG, effective when nodes have a URL. The tooltip string defaults to be the same as the label string, but this attribute permits nodes without labels to still have tooltips thus permitting denser graphs. The substrings\Nand\Gare substituted in the same manner as for the nodelabelattribute. Additionally the substring\Lis substituted with the node label string.
The following attributes apply only to polygon shape nodes:
regular=nโ ifnis non-zero then the polygon is made regular, i.e. symmetric about the x and y axis, otherwise the polygon takes on the aspect ratio of the label.builtin_polygonsthat are not already regular are made regular by this attribute.builtin_polygonsthat are already regular are not affected (i.e. they cannot be made asymmetric).peripheries=nโ sets the number of periphery lines drawn around the polygon. This value supersedes the number of periphery lines ofbuiltin_polygons.sides=nโ sets the number of sides to the polygon.n<3results in an ellipse. This attribute is ignored bybuiltin_polygons.orientation=fโ sets the orientation of the first apex of the polygon counterclockwise from the vertical, in degrees.fmay be a floating point number. The orientation of labels is not affected by this attribute. This attribute is added to the initial orientation ofbuiltin_polygons.distortion=fโ sets the amount of broadening of the top and narrowing of the bottom of the polygon (relative to its orientation). Floating point values between-1and+1are suggested. This attribute is ignored bybuiltin_polygons.skew=fโ sets the amount of right-displacement of the top and left-displacement of the bottom of the polygon (relative to its orientation). Floating point values between-1and+1are suggested. This attribute is ignored bybuiltin_polygons.
๐ (circo-specific attributes) ๐
root=true/falseโ this specifies that the block containing the given node be treated as the root of the spanning tree in the layout.
๐ฆ (neato- and fdp-specific attributes) ๐ฆ
pin=valโ ifvalis true, the node will remain at its initial position.
See https://www.graphviz.org/doc/info/shapes.html for a complete description of node shapes.
๐ Edge Attributes
weight=valโvalis the cost of the edge. Fordot, weights must be non-negative integers, no cap. Values greater than1tend to shorten the edge;weight 0flat edges are ignored for ordering nodes. Intwopi, a weight of0will cause the edge to be ignored in constructing the underlying spanning tree. Forneatoandfdp, a heavier weight will put more emphasis on the algorithm achieving an edge length closer to that specified by the edge'slenattribute.style=solid dashed dotted bold invisโ the lineup of line moods your edge can serve ๐color=colorvalueโ sets the line color for edges.color=colorvaluelistโ a':'separated list ofcolorvaluecreates parallel edges, one edge for each color. literally a whole lil squad of edges ๐dir=forward back both noneโ controls arrow direction.tailclip,headclip=falseโ disables endpoint shape clipping.target="text"โ a target string for client-side imagemaps and SVG, effective when edges have aURL. If the target string is empty, the default, then no target attribute is included in the output. The substrings'\T','\H','\E'and'\G'are substituted in the same manner as for the edgelabelattribute. Additionally the substring'\L'is substituted with the edge label string.tooltip="text"โ a tooltip string for client-side imagemaps effective when edges have aURL. The tooltip string defaults to be the same as the edgelabelstring. The substrings'\T','\H','\E'and'\G'are substituted in the same manner as for the edgelabelattribute. Additionally the substring'\L'is substituted with the edge label string.arrowhead,arrowtail=none, normal, inv, dot, odot, invdot, invodot, tee, empty, invempty, open, halfopen, diamond, odiamond, box, obox, crow.โ specifies the shape of the glyph occurring where the edge touches the head or tail node, respectively. Note that this only specifies the shape. Thedirattribute determines whether or not the glyph is drawn. (so yes bestie, an arrowhead that never shows up is entirely possible ๐)arrowsize=valโ specifies a multiplicative scale factor for the size of the arrowhead.inv_length=6,inv_width=7,dot_radius=2)headlabel,taillabel=textโ for labels appearing near the head and tail nodes of an edge.labelfontcolor,labelfontname,labelfontsizefor head and tail labels. The substrings'\T','\H','\E'and'\G'are substituted in the same manner as for the edgelabelattribute. Additionally the substring'\L'is substituted with the edge label string.headhref="url"โ sets the url for the head port in imagemap, PostScript and SVG files. The substrings'\T','\H','\E'and'\G'are substituted in the same manner as for the edgelabelattribute. Additionally the substring'\L'is substituted with the edge label string.headURL="url"โ (headURLis a synonym forheadhref.)headtarget="headtarget"โ a target string for client-side imagemaps and SVG, effective when edge heads have aURL. Theheadtargetstring is used to determine which window of the browser is used for the URL. If theheadtargetstring is empty, the default, thenheadtargetdefaults to the same value astargetfor the edge. The substrings'\T','\H','\E'and'\G'are substituted in the same manner as for the edgelabelattribute. Additionally the substring'\L'is substituted with the edge label string.headtooltip="tooltip"โ a tooltip string for client-side imagemaps effective when head ports have aURL. The tooltip string defaults to be the same as theheadlabelstring. The substrings'\T','\H', and'\E'are substituted in the same manner as for the edgelabelattribute. Additionally the substring'\L'is substituted with the edge label string.
ngl theheadtooltiplist is just'\T','\H'and'\E'โ no'\G'in there ๐ญ that's genuinely what the page says, don't come for me, I'm just the messenger ๐
tailhref="url"โ sets the url for the tail port in imagemap, PostScript and SVG files. The substrings'\T','\H','\E'and'\G'are substituted in the same manner as for the edgelabelattribute. Additionally the substring'\L'is substituted with the edge label string.tailURL="url"โ (tailURLis a synonym fortailhref.)tailtarget="tailtarget"โ a target string for client-side imagemaps and SVG, effective when edge tails have aURL. Thetailtargetstring is used to determine which window of the browser is used for the URL. If thetailtargetstring is empty, the default, thentailtargetdefaults to the same value astargetfor the edge. The substrings'\T','\H','\E'and'\G'are substituted in the same manner as for the edgelabelattribute. Additionally the substring'\L'is substituted with the edge label string.tailtooltip="tooltip"โ a tooltip string for client-side imagemaps effective when tail ports have aURL. The tooltip string defaults to be the same as thetaillabelstring. The substrings'\T','\H','\E'and'\G'are substituted in the same manner as for the edgelabelattribute. Additionally the substring'\L'is substituted with the edge label string.labeldistanceandlabelangle(in degrees CCW) โ specify the placement of head and tail labels.decorateโ draws line from edge to label. cute lil tether โจsamehead,sametailโ aim edges having the same value to the same port, using the average landing point.
๐ฏ (dot-specific attributes)
constraint=falseโ causes an edge to be ignored for rank assignment.minlen=nโ wherenis an integer factor that applies to the edge length (ranks for normal edges, or minimum node separation for flat edges).xlabel="text"โ Edge labels indotare treated as special types of nodes, with space allocated for them during node layout. This can sometimes deform the edge routing. If anxlabelis used instead, the label is placed after all nodes and edges have been positioned. In turn, this may mean that there is some overlap among the labels. (trade-offs, bestie, it's always trade-offs ๐ญ)
๐ธ (neato and fdp-specific attributes)
len=fโ sets the optimal length of an edge. The default is1.0.
โจ COMMAND-LINE OPTIONS โจ
-Gโ sets a default graph attribute.-Nโ sets a default node attribute.-Eโ sets a default edge attribute.
Example: -Gsize="7,8" -Nshape=box -Efontsize=8
--filepath=pathโ usespathas a prefix for locating externally referenced files. For example, using--filepath=bar/bazwould causefoo.pnginimage="foo.png"to be looked for on disk asbar/baz/foo.png. This overrides anyimagepathset either on the command line or as an attribute within the input graph source.-lfileโ loads custom PostScript library files. Usually these define custom shapes or styles. If-lis given by itself, the standard library is omitted.-Tlangโ sets the output language as described above.-n[1|2]โ (no-op) If set,neatoassumes nodes have already been positioned and all nodes have aposattribute giving the positions. It then performs an optional adjustment to remove node-node overlap, depending on the value of theoverlapattribute, computes the edge layouts, depending on the value of thesplinesattribute, and emits the graph in the appropriate format. Ifnumis supplied, the following actions occur:num = 1โ Equivalent to-n.num > 1โ Use node positions as specified, with no adjustment to remove node-node overlaps, and use any edge layouts already specified by theposattribute.neatocomputes an edge layout for any edge that does not have aposattribute. As usual, edge layout is guided by thesplinesattribute.num = 3โ Also fit ends of edges to nodes' borders.
-Klayoutโ override the default layout engine implied by the command name.-Oโ automatically generate output filenames based on the input filename and the-Tformat.-Pโ generate a graph of the currently available plugins. (meta much? obsessed ๐-vโ (verbose) prints various information useful for debugging.-cโ configure plugins.-qlevelโ set level of message suppression. The default is1.-sfscaleโ scale input byfscale, the default is72.-yโ invert y coordinate in output.-ofileโ write output to file.-xโ reduce graph.-Lgโ don't use grid.-LOโ use old attractive force.-Lmlโ set m-limit (distance threshold at which repulsive force is weakened to 0) tol. If not set, this defaults to infinity (repulsive force always applies).-Lniโ set number of iterations toi.-LUiโ set unscaled factor toi.-LCvโ set overlap expansion factor tov.-LT[*]vโ set temperature (temperature factor) tov.-Vโ (version) prints version information and exits.-?โ prints the usage and exits.
A complete description of the available command-line options can be found at https://www.graphviz.org/doc/info/command.html.
๐ฆ EXAMPLES ๐ฆ
okay so here's a digraph and it's giving main character energy fr fr:
digraph test123 {
a -> b -> c;
a -> {x y};
b [shape=box];
c [label="hello\nworld",color=blue,fontsize=24,
fontname="Palatino-Italic",fontcolor=red,style=filled];
a -> z [label="hi", weight=100];
x -> z [label="multi-line\nlabel"];
edge [style=dashed,color=red];
b -> x;
{rank=same; b x}
}
and here's the undirected bestie, graph:
graph test123 {
a -- b -- c;
a -- {x y};
x -- c [w=10.0];
x -- y [w=5.0,len=3];
}
๐ CAVEATS ๐
- Edge splines can overlap unintentionally.
- Flat edge labels are slightly broken. Intercluster edge labels are totally broken.
- Because unconstrained optimization is employed, node boxes can possibly overlap or touch unrelated edges. All existing spring embedders seem to have this limitation.
- Apparently reasonable attempts to pin nodes or adjust edge lengths and weights can cause instability.
bestie I'm not gonna lie, those last two are the "we've all been there, it's not just you" of graph layout ๐ญ๐ซถ
๐ AUTHORS ๐
- Stephen C. North
<north@research.att.com> - Emden R. Gansner
<erg@graphviz.org> - John C. Ellson
<ellson@research.att.com> - Yifan Hu
<yifanhu@yahoo.com>
The bitmap driver (PNG, GIF etc) is by Thomas Boutell, <http://www.boutell.com/gd>
The Truetype font renderer is from the Freetype Project (David Turner, Robert Wilhelm, and Werner Lemberg) (who can be contacted at freetype-devel@lists.lrz-muenchen.de).
๐ SEE ALSO ๐
okay so real talk โ this man page is literally just the appetizer. It has only a small amount of the information about the Graphviz layout programs, so if you want the full tea you gotta go to the source.
The most complete info lives at https://www.graphviz.org/documentation/ โ especially the onโline reference pages โจ. And good news bestie, most of these documents are also available in the doc and doc/info subtrees in the source and binary distributions, so you can read them offline like a cozy little goblin ๐ง
tcldot(n)xcolors(1)libcgraph(3)
๐ฆ the academic citation wall of fame ๐ฆ
these are the actual papers, and yes they're giving main character energy in the graph-drawing world, no cap:
- E. R. Gansner, S. C. North, K. P. Vo, "DAG โ A Program to Draw Directed Graphs", Software โ Practice and Experience 17(1), 1988, pp. 1047โ1062.
- E. R. Gansner, E. Koutsofios, S. C. North, K. P. Vo, "A Technique for Drawing Directed Graphs," IEEE Trans. on Soft. Eng. 19(3), 1993, pp. 214โ230.
- S. North and E. Koutsofios, "Applications of graph visualization", Graphics Interface 94, pp. 234โ245.
- E. R. Gansner and E. Koutsofios and S. C. North, "Drawing Graphs with dot," Available at
https://www.graphviz.org/pdf/dotguide.pdf. - S. C. North, "NEATO User's Manual". Available
https://www.graphviz.org/pdf/neatoguide.pdf. - E. R. Gansner and Y. Hu, "Efficient, Proximity-Preserving Node Overlap Removal", J. Graph Algorithms Appl., 14(1) pp. 53โ74, 2010.
๐ธ NOTES ๐ธ
okay this one's a lil treat ๐ โ on non-Windows platforms, you can send SIGUSR1 to Graphviz and it'll toggle on and off some extra points reporting in the neatogen code.
๐ that's it. that's the note. no further explanation given, we love a mysterious queen ๐
and that's the whole page bestie!! ๐ซถ you made it to the end, iconic behavior, genuinely ate and left no crumbs ๐
this was DOT(1), dated 12 January 2015 โ go draw some graphs and slay โญ
๐ฆ where this page comes from
- arch rolling: graphviz 16.1.0-2 ยท EPL
- nixpkgs unstable: graphviz 15.1.1
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms