Statt sich über das Layout einer Grafik zu verkünsteln, konzentrieren Sie sich mit Graphviz ganz auf die Inhalte und überlassen der Software das Design.
Je mehr Elemente ein Schaubild enthält, desto komplizierter fällt das Anordnen der Knoten aus. Statt nächtelang darüber zu brüten, übergeben Sie diese Aufgabe besser dem Computer, der – mit Graphviz [1] ausgestattet – diese Arbeit perfekt erledigt. Dabei basiert die Software auf einem offenen Format, das auf den Namen DOT hört und aus einfachen Textdateien besteht.
Die meisten Distributionen führen Graphviz bereits in ihren Repositories. Unter Debian und dessen Ablegern wie Ubuntu installieren Sie die Software über den Befehl apt-get install graphviz.
Grundlagen
Listing 1 zeigt die Grundlage für ein einfaches Diagramm. Die erste Zeile definiert das Diagramm mit dem Namen G. Alle anderen Bestandteile, die in den geschweiften Klammern stehen, beziehen sich auf dieses Diagramm – in diesem Fall die Verbindungen für ein Baumdiagramm. Jede Zeile schließen Sie mit einem Strichpunkt ab.
Listing 1
digraph G {
DOT -> Organisationsdiagramm;
DOT -> Pfeildiagramme;
DOT -> MindMaps;
DOT -> Netzpläne;
}
Graphviz enthält einen Renderer, der die Diagramme erzeugt. Er berechnet, welche Anordnung sich für die einzelnen Elemente am besten eignet. Die Standard-Renderer heißen dot, neato, fdp, circo und twopi. Je nachdem, welchen Renderer Sie verwenden, sehen die Diagramme anders aus.
Die Software unterstützt eine Reihe von Formaten für die Ausgabe. Zu den gebräuchlichsten gehören EPS, JPG, PNG, SVG und PDF. Eine komplette Liste erhalten Sie dot -T?. Wählen Sie als Format für die Ausgabe svg, dann können Sie das Ergebnis mit einem Zeichenprogramm von Hand nachbearbeiten.
Das eigentliche Konvertieren gelingt mit einem einfachen Befehl. Abbildung 1 zeigt das Ergebnis des folgenden Kommandos:
$ dot -T png -o b01-diagram.png b01-diagram.dot
Die Beschreibungssprache kennt im Wesentlichen drei Objekte, mit denen Sie das Diagramm erstellen (siehe Tabelle “Objekte”). Eigenschaften, die Sie in diesen Objekten festlegen, gelten für alle Objekte – es sei denn, Sie belegen die Eigenschaft mit einem neuen Wert.
Objekte
graph |
Gerichtete Graphen heißen digraph; ungerichtete Graphen bezeichnen Sie mit graph. Jedes Diagramm kann mehrere Graphen enthalten. |
node |
Knoten, die auf eine bestimmte Weise miteinander in Verbindung stehen. Sie brauchen einen Node nicht extra zu definieren, er entsteht bei seiner ersten Verwendung. |
edge |
Verknüpfungen zwischen den Nodes. Eine gerichtete Verknüpfung entsteht, sobald Sie zwei Nodes mit -> verbinden. |
Beschriftung
Standardmäßig verwendet Graphviz zum Beschriften den Namen des Nodes. Für den Node-Namen eignen sich allerdings nicht alle Zeichen, insbesondere nicht Sonderzeichen. Möchten Sie Leerzeichen, Sonderzeichen oder Umbrüche verwenden, so definieren Sie für den Node ein Label (label), wobei Sie dessen Inhalt in Anführungszeichen setzen. Ein Zeilenumbruch fügen Sie mit der Escape-Sequenz \n ein. Mit dem Code aus Listing 2 erstellen Sie eine Übersicht über die Schullaufbahn in Bayern (Abbildung 2).
Listing 2
digraph G {
G [label="Grundschule"];
H [label="Hauptschule"];
R [label="Realschule"];
Gy [label="Gymnasium"];
RMNW [label="Mathe-Naturw."];
RBWR [label="Wirtschaftlich"];
RF [label="Französisch"];
RWS [label="Musisch/Hausw./Sozial"];
GYMNW [label="Naturw.-Technisch"];
GYSPR [label="Sprachlich"];
GYMUS [label="Musisch"];
GYWISO [label="Wirtschafts- und Sozialw."];
G -> H; G -> R; G -> Gy;
R -> RMNW; R -> RBWR; R -> RF; R -> RWS;
Gy -> GYMNW; Gy -> GYSPR; Gy -> GYMUS; Gy -> GYWISO;
}
Das Ergebnis fällt nicht optimal aus: Besser wäre ein Verlauf von links nach rechts, anstatt von oben nach unten. Das Attribut rankdir des Objekts graph legt die Orientierung des Diagramms fest. Dafür gibt es die Werte TB (von oben nach unten, Grundeinstellung), LR (von links nach rechts), RL (von rechts nach links) und BT (von unten nach oben).
Das Aussehen ändern
Bei Bedarf ändern Sie das Aussehen eines Nodes über verschiedene Attribute. Dazu kommt beispielsweise shape=box zum Einsatz. Bei den Formen gilt es, zu beachten, dass bei manchen der Text über die Linie der Box hinausragt. Dies gehört zu den bislang ungelösten Problemen der Automatik. Hier müssen Sie dann noch einmal Hand anlegen, indem Sie die Größe der Form anpassen.
Die Textfarbe setzen Sie über color, die Farbe für den Hintergrund mit fillcolor. Das Programm erlaubt Farbnamen, Farbwerte in HTML-Manier (#F101FF) sowie Farbnummern. Die Angabe von fillcolor wirkt allerdings nur, wenn Sie den Style auf style=filled setzen. Eine Übersicht über die Farben finden Sie online [3].
Die Breite und Höhe für einen Node bestimmt die Software in der Regel automatisch. Mit den Attributen height und width legen Sie bei Bedarf Mindesthöhe und Mindestbreite fest. Setzen Sie das Attribut fixedsize=true für den Node, so interpretiert das Programm die beiden Werte als gesetzt und überschreitet diese nicht. Die Angabe der Größen erfolgt in Inch.
Über das Attribut style legen Sie außerdem das Aussehen (die Art des Rahmens) eines Nodes fest. Als mögliche Formen kennt Graphviz durchgezogen, mit abgerundeten Ecken, gepunktet, gestrichelt oder fett (Abbildung 3). Mit dem Attribut peripheries=2 zeichnet die Software eine doppelte Linie, mit style=invis verstecken Sie einen Node.

style verändern Sie das Aussehen der Nodes.” width=”300″ height=”140″ />
Abbildung 3: Über das Attributstyle verändern Sie das Aussehen der Nodes. Die Schriftart für das Label legen Sie mit dem Attribut fontname fest, die Schriftgröße mit dem Attribut fontsize. Das Attribut fontpath definiert, in welchen Verzeichnissen das Programm nach den Fonts sucht. Alternativ verwenden Sie die Umgebungsvariablen DOTFONTPATH oder GDFONTPATH.
Sie beschriften einen Node entweder über seinen Namen oder über das Attribut label. Dabei bestimmen Sie zusätzlich mit labelloc, wo der Renderer den Text positioniert. Dabei sorgt t dafür, dass der Text oben (“top”) steht, b setzt ihn nach unten (“bottom”). Tragen Sie bei labeljust ein r ein, erscheint der Text rechts ausgerichtet, bei l links ausgerichtet. Ohne weitere Angabe zentriert Graphviz ihn.
Edges ändern
Was für Schriften und Boxen klappt, funktioniert auch bei Linien: Deren Aussehen modifizieren Sie ebenfalls mit dem Attribut style. Wie bei den Linien von Nodes besteht hier die Möglichkeit, diese durchgezogen, fett, gestrichelt, gepunktet oder unsichtbar zu gestalten (Abbildung 4).

Abbildung 4: Ebenso wie die Kästen verändern Sie das Aussehen der Linien bei Bedarf über Attribute.
Für die Farbe verwenden Sie die gleichen Werte wie bei Nodes. Für Anfang und Ende der Linie stehen verschiedene Symbole bereit. Über das Attribut arrowhead definieren Sie die Spitze und über arrowtail den Fuß eines Pfeils. Mit arrowsize verändern Sie bei Bedarf die Form von dessen Spitze.
Über dir legen Sie die Richtung fest (both für beide, forward (Standard), back für umgedreht). Mittels none erzeugen Sie eine Linie ohne Spitze. Eine umfangreiche Übersicht finden Sie online [4].
Mit dem Attribut headclip=false und tailclip=false legen Sie fest, dass die Linie nicht bis zum Außenrand des Nodes läuft, sondern bis in dessen Mitte. Standardmäßig bildet die Software für jede Linie einen neuen Verbindungspunkt am Rand des Nodes. Möchten Sie mehrere Punkte zusammenfassen, weisen Sie diesen den gleichen Wert für sametail beziehungsweise samehead zu (Beispiel: sametail=gruppeA, Abbildung 5).

Abbildung 5: Bei Bedarf fassen Sie Verbindungspunkte zusammen, um eine Grafik übersichtlicher zu gestalten.
Graphviz bietet drei Möglichkeiten, um eine Verbindungslinie zu beschriften: Mit dem Attribut label setzen Sie den Text in die Mitte der Linie. Über headlabel landet die Beschriftung am Kopf der Linie. Durch das Platzieren am Kopf oder am Fuß kommt es aber unter Umständen dazu, dass der Text zu nahe an der Linie oder am Node liegt. Hier helfen die Attribute labelangle und labeldistance weiter.
Sie dürfen alle drei Arten der Beschriftung gleichzeitig verwenden. Mit dem Attribut decorate=true sorgen Sie dafür, dass das Programm den Text unterstreicht, und mit labelfloat=true erlauben Sie das Überlappen, was dazu führt, dass das Diagramm kompakter ausfällt.
Zusätzlich können Sie den Text mit den Attributen labelfontcolor, labelfontname und labelfontsize anpassen. Mit dem Attribut labelangle und labeldistance legen Sie fest, wo die Applikation den Text platziert. Dabei kommen Polarkoordinaten zum Einsatz. Dabei setzt labelangle den Winkel in Grad und labeldistance den Skalierungsfaktor für den Abstand zum Node.
Gesamtansicht
Mit dem Attribut size bestimmen Sie die maximale Größe des gesamten Bilds (graph [size="0.5,0.5"];). Sollte der Graph diese überschreiten, so skaliert die Software das Bild entsprechend, sodass es die vorgegebenen Werte einhält. Dabei verkleinert das Programm die Ausgabe so lange (ohne das Seitenverhältnis zu ändern), bis Breite und Höhe innerhalb der Vorgabe liegen.
Hängen Sie der Größenangabe ein Ausrufezeichen an, so skaliert Graphviz das Bild immer auf die vorgegebene Größe: Fällt die Grafik kleiner aus, dann vergrößert das Programm sie und umgekehrt. Bei dieser Operation beachtet das Tool aber ebenfalls das Seitenverhältnis. Das Attribut interagiert dabei mit dem Attribut ratio, welches das Seitenverhältnis (Höhe/Breite) des Bilds festlegt.
Das Attribut page legt die Größe der Seite fest. Ist das Diagramm größer als die Seite, so landen rechteckige Bereiche der Zeichnung auf mehreren Seiten. Auf diese Weise erstellen Sie quasi ein Poster (nur für mehrseitige Bildformate als Ausgabe). Das Attribut margin legt den Rand der Zeichnung fest. Haben Sie das Attribut page mit einem gültigen Wert gesetzt, spezifiziert pagedir die Seitenausrichtung.
Das Attribut nodesep legt den minimalen Abstand zweier Nodes in derselben Ebene fest, ranksep legt den minimalen vertikalen Abstand zweier Nodes fest (zwischen den übergeordneten und der Ebene darunter, siehe Zeile 2 in Listing 3).
Geben Sie zusätzlich equally hinter der Zahl an, haben die Ebenen den gleichen Abstand. Gerade bei einer hierarchischen Struktur ist es wichtig, Nodes auf eine Ebene zu platzieren. Mit dem Attribut rank=same bilden Sie Gruppen (siehe Zeile 5 in Listing 3).
Es gibt noch eine Menge weitere Parameter, die Sie aber meist nur für spezielle Anwendungen benötigen. Eine komplette Übersicht liefert das Graphviz-Online-Handbuch [5]. Ergänzen Sie das Listing 2 entsprechend (siehe Listing 3), so hat das auf das Aussehen eine deutliche Auswirkung (Abbildung 6).
Listing 3
digraph G {
graph [rankdir=LR,nodesep=.5,ranksep=.5];
node [shape=box,style=rounded,width=3];
{ rank = same; H; R; Gy; }
G [label="Grundschule",fillcolor=lightgray,style=filled];
H [label="Hauptschule",fillcolor=lightgray,style=filled];
R [label="Realschule",fillcolor=lightgray,style=filled];
Gy [label="Gymnasium",fillcolor=lightgray,style=filled];
RMNW [label="Mathe-Naturw."];
RBWR [label="Wirtschaftlich"];
RF [label="Französisch"];
RWS [label="Musisch/Hausw./Sozial"];
GYMNW [label="Naturw. - Technologisch"];
GYSPR [label="Sprachlich"];
GYMUS [label="Musisch"];
GYWISO [label="Wirtschafts- und Sozialw."];
H -> R [arrowhead="vee",dir="both",arrowtail="vee",style=dotted,label=" Wechsel"];
R -> Gy [style=dotted,dir="both",arrowtail="vee",style=dotted,label=" Wechsel"];
G -> H [style=bold];
G -> R [style=bold];
G -> Gy [style=bold];
R -> RMNW [arrowhead=onormal];
R -> RBWR [arrowhead=onormal];
R -> RF [arrowhead=onormal];
R -> RWS [arrowhead=onormal];
Gy -> GYMNW [arrowhead=onormal];
Gy -> GYSPR [arrowhead=onormal];
Gy -> GYMUS [arrowhead=onormal];
Gy -> GYWISO [arrowhead=onormal];
}

Abbildung 6: Mit einigen zusätzlichen Attributen verleihen Sie der Grafik ein deutlich attraktiveres Aussehen als mit den Standardwerten.
Renderer
Mit der Beschreibungssprache DOT legen Sie fest, welche Nodes es gibt, und wie diese zueinander in Beziehung stehen. Die Position im Diagramm legt der Renderer fest. Der Renderer dot zeichnet das Diagramm streng hierarchisch strukturiert. Die Diagramme weisen immer eine feste Orientierung auf (Abbildung 7).

dot.” width=”300″ height=”87″ />
Abbildung 7: Rendererdot. Der Renderer neato ordnet die Nodes zirkulär von der Mitte nach außen an (Abbildung 8) und eignet sich gut für Mindmaps mit symmetrischem Layout. Dabei versucht die Software, ein möglichst enges Zusammenspiel der Nodes zu erreichen. Um diese Symmetrie besser darzustellen, kommen gerade Linien zwischen den Nodes zum Einsatz.

neato.” width=”210″ height=”300″ />
Abbildung 8: Rendererneato. Der Renderer fdp erzeugt ähnliche Ergebnisse (Abbildung 9) wie neato. Jedoch versucht er, ein weites Zusammenspiel der Nodes zu erreichen. Dies verteilt die Nodes gleichmäßiger auf der Zeichenfläche.

fdp.” width=”300″ height=”228″ />
Abbildung 9: Rendererfdp. Mit circo versucht Graphviz, die vorhandenen hierarchischen Strukturen zu erhalten und die Nodes ähnlich wie neato aufzubauen (Abbildung 10).

circo.” width=”300″ height=”250″ />
Abbildung 10: Renderercirco. Der Renderer twopi versucht, die hierarchische Struktur aufzulösen, und baut die Nodes ähnlich wie neato auf (Abbildung 11).

twopi.” width=”300″ height=”280″ />
Abbildung 11: Renderertwopi.sfdp versucht wie fdp, die hierarchische Struktur aufzulösen, verwendet aber einen Multi-Skalen-Ansatz, um große Graphen in kurzer Zeit zu rendern (Abbildung 12).

sfdp.” width=”216″ height=”119″ /> Abbildung 12: Renderer sfdp.
Für gruppierte Grafiken ist dagegen osage gedacht (Abbildung 13). Viele weitere Beispiele dazu finden Sie online [6].

osage.” width=”237″ height=”112″ /> Abbildung 13: Renderer osage.
Fazit
Graphviz bietet eine ganze Menge Potenzial, für viele Aufgaben genügen seine automatischen Funktionen vollkommen. Zudem hat das Programm in Bezug auf die Formen der Boxen und Pfeilspitzen eine Menge zu bieten. Allerdings offeriert Graphviz keine Möglichkeit, diese selbst zu definieren. Dadurch lassen sich einige genormte Diagrammtypen nicht korrekt umsetzen.
Darüber hinaus existieren Einschränkungen bei der Ausgabe. Linien dürfen nur “geschwungen” oder “gerade” sein, vertikale oder horizontale Verbindungslinien unterstützt die Software nicht. Das Beschriften klappt nur mit Text – andere Elemente, wie mathematische Formeln oder Bilder, sind nicht vorgesehen.
Abhilfe schafft das Tool Dot2tex [7], das Graphviz nutzt, um die Position der Objekte zu berechnen und die Ausgabe in ein entsprechendes LaTeX-Format umzuwandeln. Dadurch erhalten Sie mehr Möglichkeiten beim Gestalten. Wie dies funktioniert, zeigt ein Folgeartikel zu diesem Workshop in einer der nächsten Ausgaben.
Glossar
-
Inch
-
In angelsächsischen Ländern verbreitete Maßeinheit, die 25,4 Millimetern entspricht. Der 72. Teil eines Inch repräsentiert die Maßeinheit “Punkt”, die in der Typographie zum Einsatz kommt.
Infos
[1] Graphviz: http://graphviz.org
[2] Tutorial (deutsch): http://4webmaster.de/wiki/Graphviz-Tutorial
[3] Farbnamen: http://graphviz.org/content/color-names
[4] Pfeilspitzen: http://graphviz.org/content/arrow-shapes
[5] DOT-Attribute: http://www.graphviz.org/content/attrs
[6] Beispiele: http://www.graphviz.org/Gallery.php
[7] Dot2tex: http://www.fauskes.net/code/dot2tex/





