Wie im ersten Teil bereits angesprochen, hier nun die Fortsetzung.
In diesem Teil soll es nun um die Kanten-Attribute (edge attributes) gehen. Auch hier sei darauf verwiesen, dass ich Attribute und Eigenschaften sofort bei ihrem ersten Auftreten erläutern und im weiteren Verlauf nicht mehr darauf eingehen werde.
Da ich im ersten Teil nicht darauf hingewiesen habe, möchte ich es an dieser Stelle nachholen.
Die Eigenschaften von Knoten- bzw. Kantenattribute werden auf die nachfolgenden Knoten und Kanten weitervererbt! Ich bitte dieses zu beachten.
Am folgenden Diagramm sollen die Kanten-Attribute erläutert werden.
Auf einige Attribute bin ich bereits im ersten Teil eingegangen. Der Vollständigkeit halber möchte ich sie hier nochmals erwähnen.
Die Notation könnt Ihr in gewohnter Weise auf der Seite ashitani.jp/gv/ eingeben.
Diagrammtitel der ersten Ebene
Bis auf den Diagrammtitel "Kleines GraphViz Tutorial - Teil 2" bleibt der Code unverändert.
compound="true";remincross="true";// Diagrammtitel der ersten Ebene"Kleines GraphViz Tutorial - Teil 2" [shape="box",
width="5.0",
height="0.7",
peripheries="1",
fontcolor="0.6,0.9,0.8",
fontsize="18",
color="#A0522D",
style="dashed,diagonals,filled",
fillcolor="lavenderblush"];// Hinweis"Liste unvollstaendig" [shape="box",
width="2.0",
height="0.2",
peripheries="1",
fontcolor="black",
fontsize="9",
fontname="Courier",
color="navy",
style="filled",
fillcolor="white"];
Die erste Ebene
Kante und Knoten der zweiten Ebene
Für die erste Ebene geben wir diesen Code ein:
// Kante erste Ebene - Knoten zweite Ebeneedge [color="slateblue",
arrowhead="invodot",
arrowtail="invodot",
arrowsize="0.7"];// Knoten der zweiten Ebenenode [shape="box",
width="15.0",
peripheries="2",
fontcolor="black",
fontsize="12",
color="powderblue",
style="filled"];"Kleines GraphViz Tutorial - Teil 2"--"Knoten-Attribute\nedge [attributes]";
Die zweite Ebene
Bis auf die Knotenbezeichnung der zweiten Ebene ändert sich nichts. Hier nochmals die Kantenattribute arrowhead, arrowtail und arrowsize kurz erläutert:
- Kanten- bzw. Pfeilkopf:
arrowheadmit den Werten (none|normal|dot|odot|inv|invdot|invodot) - Kanten- bzw. Pfeilende:
arrowtailmit den Werten (none|normal|dot|odot|inv|invdot|invodot) - Kanten-/Pfeilgröße:
arrowsizeals skalierbarer Wert
Kante und Knoten der dritten Ebene
Für die dritte Ebene geben wir folgenden Code ein:
// Kante zweite Ebene - Knoten dritte Ebeneedge [color="saddlebrown",
arrowhead="dot",
arrowtail="odot",
arrowsize="0.7"];// Knoten der dritten Ebenenode [shape="ellipse",
width="1.3",
peripheries="2",
fontcolor="black",
color="lavender",
style="filled"];"Kanten-Attribute\nedge [attributes]"--"arrowhead/arrowtail";"Kanten-Attribute\nedge [attributes]"--"arrowsize";"Kanten-Attribute\nedge [attributes]"--"headlabel";"Kanten-Attribute\nedge [attributes]"--"taillabel";"Kanten-Attribute\nedge [attributes]"--"label";"Kanten-Attribute\nedge [attributes]"--"labelfontsize";"Kanten-Attribute\nedge [attributes]"--"labelfontname";"Kanten-Attribute\nedge [attributes]"--"labelfontcolor";"Kanten-Attribute\nedge [attributes]"--"color";"Kanten-Attribute\nedge [attributes]"--"style";"Kanten-Attribute\nedge [attributes]"--"headport/tailport";
Die dritte Ebene
Auch hier hat sich bis auf die Knotenbezeichnung der dritten Ebene nichts weiter am Code geändert.
Hinweis!
Attributnamen, die als Knotennamen verwendet werden, müssen zwingend in Anführungsstriche "..." gesetzt werden, da GraphViz sonst versucht, sie zu verarbeiten.
Kante und Knoten der vierten Ebene
Der Code der vierten Ebene ist etwas umfangreicher. Dieser lautet folgendermaßen:
// Knoten der vierten Ebenenode [shape="box",
width="0.75",
peripheries="1",
fontcolor="#990000",
fontsize="9",
fontname="Courier",
color="black",
style="filled",
fillcolor="#FFF5E6"];"arrowhead/arrowtail" [width="5.0"];"headport/tailport" [width="8.0"];// Kante dritte Ebene - Knoten vierte Ebene - Kanten- bzw. Pfeilartenedge [color="darkseagreen",
arrowhead="none",
arrowtail="none",
arrowsize="0.7"];"arrowhead/arrowtail"--"none";edge [color="darkseagreen",
arrowhead="normal",
arrowtail="normal",
arrowsize="0.7"];"arrowhead/arrowtail"--"normal";edge [color="darkseagreen",
arrowhead="dot",
arrowtail="dot",
arrowsize="0.7"];"arrowhead/arrowtail"--"dot";edge [color="darkseagreen",
arrowhead="odot",
arrowtail="odot",
arrowsize="0.7"];"arrowhead/arrowtail"--"odot";edge [color="darkseagreen",
arrowhead="inv",
arrowtail="inv",
arrowsize="0.7"];"arrowhead/arrowtail"--"inv";edge [color="darkseagreen",
arrowhead="invdot",
arrowtail="invdot",
arrowsize="0.7"];"arrowhead/arrowtail"--"invdot";edge [color="darkseagreen",
arrowhead="invodot",
arrowtail="invodot",
arrowsize="0.7"];"arrowhead/arrowtail"--"invodot";
Die vierte Ebene
Die neuen Knotennamen stellen die Eigenschaften der Attribute arrowhead und arrowtail dar, die hier als dazugehörige Kante verwendet wird.
Als nächstes folgt der Code zweier Cluster zum Gruppieren der Knoten für die Pfeilgröße und der Schriftart:
// Cluster1 als Knoten der vierten Ebene// Gruppierung der Knoten fuer die Pfeilgroessesubgraph cluster1 {fontsize="10";
label="Die Pfeilgroesse" [
fontcolor="darkgreen"
];
style="filled";
fillcolor="#FFF5E6";// Knoten fuer die Pfeilgroessenode [peripheries="1",
fontcolor="#990000",
fontsize="9",
fontname="Courier",
color="coral",
style="filled",
fillcolor="#F5FFF5"];"Zahlenwert, z.B." [shape="box",
width="2.7"];"0.7" [shape="box"];"1.2" [shape="box"];"1.7" [shape="box"];edge [color="royalblue",
arrowhead="odot",
arrowtail="none",
arrowsize="0.7"];"Zahlenwert, z.B."--"0.7";edge [color="royalblue",
arrowhead="odot",
arrowtail="none",
arrowsize="1.2"];"Zahlenwert, z.B."--"1.2";edge [color="royalblue",
arrowhead="odot",
arrowtail="none",
arrowsize="1.7"];"Zahlenwert, z.B."--"1.7";}
Die vierte Ebene – Cluster1
Hier der Code für Cluster2:
// Cluster2 als Knoten der vierten Ebene// Gruppierung der Knoten zur Schriftartsubgraph cluster2 {fontsize="10";label="Die Schriftart" [fontcolor="darkgreen"];style="filled";fillcolor="#FFF5E6";// Knoten zur Schriftartnode [shape="box",
peripheries="1",
fontcolor="#990000",
fontsize="9",
color="coral",
style="filled",
fillcolor="#F5FFF5"];"Standardschrift";"Times" [fontname="Times"];"Helvetica" [fontname="Helvetica"];"Courier" [fontname="Courier"];"Symbol" [fontname="Symbol"];edge [color="royalblue",
arrowhead="none",
arrowtail="none"];"Standardschrift"--"Times"--"Helvetica"--"Courier"--
"Symbol";}
Die vierte Ebene – Cluster2
Hinweis!
Ich habe im Listing für Cluster2 in Zeile 33 aufgrund der Länge einen Zeilenumbruch eingefügt. Dieser Zeileneintrag muss komplett hintereinander geschrieben werden!
Abschließend folgt der restliche Code sowohl für den Kantenansatz an die Cluster als auch für die Kanten der übrigen Knoten:
// Kante dritte Ebene - Cluster1, 2 und Knoten der vierten Ebeneedge [arrowhead="none",
arrowtail="inv",
arrowsize="0.7"];"arrowsize"--"Zahlenwert, z.B." [lhead="cluster1"];"labelfontname"--"Standardschrift" [lhead="cluster2"];
Die vierte Ebene – Kante zu den Clustern
Die beiden Attribute lhead und ltail nochmals kurz erläutert.
- Kantenansatz:
lheadName des Clusters der den Kopf der Kante verwendet - Kantenansatz:
ltailName des Clusters der das Ende der Kante verwendet
Nun der Code für die Kantenbezeichnungen:
// Kante dritte Ebene - Knoten vierte Ebene - Kantenbezeichnungenedge [arrowhead="none",
arrowtail="inv",
headlabel="head",
taillabel="",
labelfontcolor="darkgreen",
labelfontsize="10"];"headlabel"--"irgendein Name";edge [arrowhead="none",
arrowtail="inv",
headlabel="",
taillabel="tail",
labelfontcolor="darkgreen",
labelfontsize="10"];"taillabel"--"irgendein Name";edge [arrowhead="none",
arrowtail="inv",
taillabel=""];"label"--"irgendein Name";
Die vierte Ebene – Kantenbezeichnungen
Die neu hinzugekommenen Attribute lauten:
- Beschriftung am Kanten- bzw. Pfeilkopf:
headlabelmit einen Namen - Beschriftung am Kanten- bzw. Pfeilende:
taillabelmit einen Namen - Schriftfarbe der Beschriftung:
labelfontcolormit Werten als Farbname, als HSB-Tripel mit Werten zwischen0und1oder als RGB-Tripel mit Hexadezimalwerten zwischen00undFF - Schriftgröße der Beschriftung:
labelfontsizemit einem Zahlenwert
Hier der Code für die Labelgröße, Labelfarbe und Farbe:
// Kante dritte Ebene - Knoten vierte Ebene - Labelgroesseedge [arrowhead="none",
arrowtail="inv",
headlabel="",
taillabel="Labelgroesse",
labelfontcolor="crimson",
labelfontsize="15"];"labelfontsize"--"Zahlenwert, z.B. 15";// Kante dritte Ebene - Knoten vierte Ebene - Labelfarbeedge [style="solid",
arrowhead="none",
arrowtail="inv",
arrowsize="0.7",
taillabel="Labelfarbe",
labelfontcolor="crimson",
labelfontsize="10"];"labelfontcolor"--"Farbname, RGB- oder HSB-Tripel\nroyalblue, #FF0000 oder 0.6,0.9,0.8";edge [style="solid",
arrowhead="none",
arrowtail="inv",
arrowsize="0.7",
taillabel=""];"color"--"Farbname, RGB- oder HSB-Tripel\nroyalblue, #FF0000 oder 0.6,0.9,0.8";
Die vierte Ebene – Labelgröße, Labelfarbe und Farbe
Es folgt der Code für das Kantenformat:
// Kante dritte Ebene - Knoten vierte Ebene - Kantenformatedge [style="solid",
arrowhead="none",
arrowtail="inv",
arrowsize="0.7"];"style"--"solid";edge [style="dashed",
arrowhead="none",
arrowtail="inv",
arrowsize="0.7"];"style"--"dashed";edge [style="dotted",
arrowhead="none",
arrowtail="inv",
arrowsize="0.7"];"style"--"dotted";edge [style="bold",
arrowhead="none",
arrowtail="inv",
arrowsize="0.7"];"style"--"bold";
Die vierte Ebene – Kantenformat
Abschließend noch der Code für die Kanten- bzw. Pfeilausrichtung:
// Kante dritte Ebene - Knoten vierte Ebene - Ausrichtungedge [style="solid",
headport="n"];"headport/tailport"--"n";edge [headport="ne"];"headport/tailport"--"ne";edge [headport="e"];"headport/tailport"--"e";edge [headport="se"];"headport/tailport"--"se";edge [headport="s"];"headport/tailport"--"s";edge [headport="sw"];"headport/tailport"--"sw";edge [headport="w"];"headport/tailport"--"w";edge [headport="nw"];"headport/tailport"--"nw";
Die vierte Ebene – Kanten- bzw. Pfeilausrichtung
Die beiden neuen Attribute lauten:
- Ausrichtung von Kanten- bzw. Pfeilkopf:
headportmit den Werten (n|ne|e|se|s|sw|w|nw) - Ausrichtung von Kanten- bzw. Pfeilende:
tailportmit den Werten (n|ne|e|se|s|sw|w|nw)
Die Werte entsprechen dabei den Himmelsrichtungen.
Ich stelle Euch wieder die dazugehörige Textdatei graphviz_tutorial_edge zur Verfügung.
Sollte das Diagramm nicht dargestellt werden, so ist es ratsam, die Kommentare und Leerzeilen zu entfernen.
Weiterführende Informationen sind im PDF-Dokument dot_guide zu finden.
Resümee
Neben dieser Website, auf der die Notation von Hand eingegeben werden muss, existieren darüber hinaus eine Vielzahl von Programmen mit denen über eine grafische Benutzeroberfläche Diagramme schnell und einfach erstellt werden können.
Hier möchte ich die Programme uDraw(Graph) der Uni Bremen (siehe Bild) sowie aiSee der AbsInt Angewandte Informatik GmbH erwähnen.
Letzteres verwendet die GDL-Notation, die ähnlich der DOT-Notation aufgebaut ist und ebenfalls einfach zu erlernen ist.
Die Graphen auf der Grundlage einer Auszeichnungssprache wie XHTML bzw. XML zu erstellen, deren Aussehen mittels Stylesheet-Datei zu beeinflussen und im Browser darzustellen, ist derzeit leider noch nicht möglich.
Weiterführende Links:


