[[Vorlage(Getestet, focal, bionic)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:Programme_starten:Programme starten] }}} [[Inhaltsverzeichnis(2)]] [http://www.graphviz.org Graphviz] {en} ist eine kleine Programmsammlung, mit der sich sehr einfach und sehr schnell Graphen in Form von Baumstrukturen oder Beziehungsdiagrammen erstellen lassen. Als Alternative zu Graphviz kann das [:Java:]-basierende, mit einer grafischen Oberfläche ausgestattete Programm [:yEd:] dienen. = Installation = Graphviz liegt als Paket für Ubuntu in den offiziellen Paketquellen vor [1]: {{{#!vorlage Paketinstallation graphviz }}} = Nutzung = Die Nutzung von Graphviz läuft in zwei Schritten ab: 1. Der zu zeichnende Graph wird mit Hilfe der recht einfachen Skriptsprache / Beschreibungssprache namens "DOT" beschrieben. 1. Im Terminal wird mit Hilfe eines einfachen Programmaufrufes aus der Skriptdatei eine Grafik erstellt. == Beschreibung des Graphen == Die Textdatei, die den Graphen beschreibt, lässt sich mit jedem beliebigen [:Editor:] erstellen. Die Datei benötigt keine Dateiendung. Ein Graph besteht grundsätzlich nur aus zwei Elementen: * Knoten (engl. "nodes") - diese enthalten die darzustellenden Elemente * Kanten (engl. "edges") - diese verbinden die einzelnen Knoten Graphviz kennt dabei zwei verschiedene Arten von Graphen: * gerichtete Graphen, d.h. die Knoten stehen in einer bestimmten Beziehung zueinander, die Kanten werden als Pfeile dargestellt. * ungerichtete Graphen, d.h. die Knoten stehen in keiner bestimmten Beziehung zueinander, die Kanten werden als Linien dargestellt. Weiterhin können Knoten auch zu Gruppen zusammengefasst werden. Für die Knoten und Kanten bestehen verschiedene optische Darstellungsmöglichkeiten, wie z.B.: * Knoten: Form des Knoten (rund, eckig, rautenförmig, ...), farbig oder nicht farbig hinterlegt, außerdem kann der Knoten noch intern unterteilt werden * Linien: fett, farbig, mit Beschriftung, etc. Eine vollständige Übersicht gibt es auf der Homepage von Graphviz. == Darstellung des Graphen == Um den Graphen darzustellen, öffnet man ein Terminal [2] und gibt folgenden Befehl ein: {{{#!vorlage Befehl # Allgemein dot -T -o # Beispiel dot -Tpng daten.gv -o graph.png }}} Die Angaben ``-T`` und ``-o`` sind dabei Pflicht, keine Optionen! Graphviz kennt verschiedenene Grafikformate wie '''png''', '''jpg''', '''gif''', '''svg''' und '''ps'''. Alle aktuell unterstützten Formate kann man per `dot -Txxx` herausfinden. {{{#!vorlage Hinweis Zwischen ``-T`` und dem Grafikformat darf __keine__ Leerstelle stehen. Möchte man z.B. eine '''png'''-Datei erzeugen, so ist die korrekt Angabe ``-Tpng`` (siehe Beispiel). }}} Die enthält die Beschreibung des Graphen, der Name der Ausgabedatei kann frei gewählt werden. {{{#!vorlage Hinweis Graphviz ergänzt __nicht__ automatisch die richtige Dateiendung, diese muss mit dem Namen des Graphen eingegeben werden, also z.B. '''graph.png''' (siehe Beispiel). }}} Der im obige Aufruf genannte Befehl "`dot`" ist dabei das Programm, welches aus der Beschreibungsdatei den Graphen erstellt. Graphviz kennt aber noch andere Programme für diesen Zweck, wobei die Darstellung des Graphen dann variiert, siehe auch Abschnitt [#bsp Beispiele]. ||<-2 rowclass="titel"> '''Programme zum Erstellen von Graphen'''|| || '''Name'''||'''Aussehen des Graph'''|| ||'''dot'''||Hierarchische Struktur, speziell für gerichtete Graphen.|| ||'''neato'''||Kreisförmig Darstellung, für ungerichtete Graphen.|| ||'''twopi'''||Kreisförmig Darstellung, für ungerichtete Graphen.|| ||'''circo'''||Halbkreisförmig Darstellung, für ungerichtete Graphen.|| Eine detaillierte Beschreibung findet man in der [http://www.graphviz.org/Documentation.php Online-Dokumentation] {en} zu Graphiz. Ein deutsches Tutorial findet man [http://www.oliver-konow.de/2008/09/20/kleines-graphviz-tutorial-teil1/ hier] {de} . [[Anker(bsp)]] = Beispiele = Was sich in der Beschreibung vielleicht relativ komplex anhört, ist in der Nutzung hingegen recht einfach, wie die folgenden Beispiele zeigen. Alle Beispiele führen auch in die Beschreibungssprache DOT ein. Als Beispiel wird dabei die Aufteilung einer Festplatte '''hda''' verwendet. Auf der Homepage von Graphiz gibt es noch eine Vielzahl von weiteren [http://www.graphviz.org/Gallery.php Beispielen] {en} in Form von (teilweise recht komplexen) Graphen und den zugehörigen Beschreibungsdateien. [[Anker(gerichtet)]] == Gerichtete Graphen == === Beispiel 1 === Das erste Beispiel zeigt die einfachste Form einer Beschreibung: {{{ digraph G { hda -> hda1; hda -> hda2; hda -> hda3; hda -> hda4; } }}} Die Beschreibung des Graphen wird mit "`digraph`" eingeleitet, "`G`" ist der Name des Graphen, dieser kann beliebig gewählt werden. Die eigentliche Beschreibung wird in geschweifte Klammern eingeschlossen. Jede Zeile sollte (muss aber nicht) mit einen Semikolon abgeschlossen werden. In diesem Beispiel werden keine Knoten definiert; es reicht, die Beziehung der Knoten untereinander zu definieren. Der mit "`dot`" erzeugte Graph sieht so aus: [[Bild(./dot_bsp.png)]] === Beispiel 2 === Im zweiten Beispiel werden die Knoten definiert und mit einer Bezeichnung (''Label'') versehen, zusätzlich wird der Knoten "`hda`" mit einem roten Hintergrund und die vier "Unterknoten" eckig dargestellt: {{{ digraph G { hda [style=filled, color="red", label="hda"] /*Unterknoten eckig darstellen*/ node [shape=box] hda1 [label="Root"] hda2 [label="Home"] hda3 [label="SWAP"] hda4 [label="NTFS"] hda -> hda1; hda -> hda2; hda -> hda3; hda -> hda4; } }}} Der entsprechende Graph sieht so aus: [[Bild(./bsp2.png)]] Wie man sieht, wird nun die Bezeichnung anstelle des Namens des Knotens angezeigt. Der Befehl "`node`" definiert dabei die Darstellungsart des Knotens und bezieht sich auf alle in Skript folgenden Knoten. Wie man im Listing auch sieht, werden Kommentare zwischen `/* ... */` eingeschlossen. === Beispiel 3 === Im dritten Beispiel werden die Knoten hda1, hda2 und hda3 zu einer Gruppe mit dem Namen "Linux" zusammengefasst, die Kante von hda zu hda4 wird zusätzlich fett und blau dargestellt und auch beschriftet: {{{ digraph G { hda [style=filled, color="red", label="hda"] node [shape=box]; subgraph cluster_linux { style=filled; color=grey; label="Linux"; hda1 [label="Root"] hda2 [label="Home"] hda3 [label="SWAP"] } hda4 [label="NTFS"]; hda -> hda1; hda -> hda2; hda -> hda3; hda -> hda4 [style="bold", color="blue", label="mount read-only"]; } }}} Das Ergebnis sieht so aus: [[Bild(./bsp3.png)]] Wie man sieht, wird in diesem Beispiel eine Gruppe mit "subgraph cluster_linux" erzeugt, wobei der Name __nicht__ beliebig gewählt werden kann. Der Name muss immer mit dem Wort "`cluster`" beginnen. Danach folgt der individuelle Name des Clusters (der Unterstrich gehört in diesem Beispiel schon dazu; es ist rein optional und dient nicht zur Trennung!). Die allgemeine Syntax lautet also: cluster"`name`", wobei "`name`" frei gewählt werden kann. Die Gruppe wird ebenfalls von geschweiften Klammern eingeschlossen. === Beispiel 4 === Hier werden die Knoten in drei Teile unterteilt, so dass zusätzliche Beschriftungen möglich ist. {{{ digraph G { node [shape=record]; hda [ label="40 GB | hda | "]; hda1 [ label="10 GB | Root | hda1" ]; hda2 [ label="14 GB | Home | hda2" ]; hda3 [ label="1 GB | SWAP | hda3" ]; hda4 [ label="15 GB | NTFS | hda4" ]; hda -> hda1; hda -> hda2; hda -> hda3; hda -> hda4; } }}} Das Ergebnis sieht so aus: [[Bild(./bsp4.png)]] Die Unterteilung erfolgt mit Hilfe des Pipe-Zeichens '''|''', wobei zusätzlich die eckigen Klammern gesetzt werden müssen. == Ungerichtete Graphen == Im folgenden als Beispiel ein ungerichteter Graph, welcher inhaltlich dem [#gerichtet ersten Beispiel] der gerichteten Graphen entspricht. {{{ graph G { hda -- hda1; hda -- hda2; hda -- hda3; hda -- hda4; } }}} Wie man sieht, bestehen zwei Hauptunterschiede: Die Datei wird mit "`graph`" (anstatt "`digraph`") eingeleitet, die Kanten werden mit "--" (anstatt "->") definiert. Ansonsten gelten alle unter "Gerichtete Graphen" gezeigten Formatierungsmöglichkeiten auch für ungerichtete Graphen. Je nach gewähltem Programm kann das Aussehen des oben beschriebenen Graphen variieren. === Dargestellt mit neato === [[Bild(./neato_bsp.png)]] === Dargestellt mit twopi === [[Bild(./twopi_bsp.png)]] === Dargestellt mit circo === [[Bild(./circo_bsp.png)]] = Graphische Oberfläche = In dem Paket von graphviz ist eine etwas ältere graphische Oberfläche enthalten. Sie lässt sich mit dem Befehl "`dotty`" starten [3]. Mit einem Linksklick [[Vorlage(Tasten, lmt)]] können Knoten erstellt oder verschoben werden. Mit der mittleren Maustaste [[Vorlage(Tasten, mmt)]] lassen sich zwei Knoten mit einer Kante verbinden. Ein Rechtsklick [[Vorlage(Tasten, rmt)]] (gedrückt halten) öffnet das Menü zum Speichern und für weitere Aktionen. * [https://graphviz.gitlab.io/_pages/pdf/dottyguide.pdf dottyguide.pdf] {dl} {en} # tag: Büro, Grafik