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 Ebene
edge [
color="slateblue",
arrowhead="invodot",
arrowtail="invodot",
arrowsize="0.7"];
// Knoten der zweiten Ebene
node [
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:
arrowhead
mit den Werten (none
|normal
|dot
|odot
|inv
|invdot
|invodot
) - Kanten- bzw. Pfeilende:
arrowtail
mit den Werten (none
|normal
|dot
|odot
|inv
|invdot
|invodot
) - Kanten-/Pfeilgröße:
arrowsize
als skalierbarer Wert
Kante und Knoten der dritten Ebene
Für die dritte Ebene geben wir folgenden Code ein:
// Kante zweite Ebene - Knoten dritte Ebene
edge [
color="saddlebrown",
arrowhead="dot",
arrowtail="odot",
arrowsize="0.7"];
// Knoten der dritten Ebene
node [
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 Ebene
node [
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. Pfeilarten
edge [
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 Pfeilgroesse
subgraph cluster1 {
fontsize="10";
label="Die Pfeilgroesse" [
fontcolor="darkgreen"
];
style="filled";
fillcolor="#FFF5E6";// Knoten fuer die Pfeilgroesse
node [
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 Schriftart
subgraph cluster2 {
fontsize="10";
label="Die Schriftart" [
fontcolor="darkgreen"
];
style="filled";
fillcolor="#FFF5E6";
// Knoten zur Schriftart
node [
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 Ebene
edge [
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:
lhead
Name des Clusters der den Kopf der Kante verwendet - Kantenansatz:
ltail
Name des Clusters der das Ende der Kante verwendet
Nun der Code für die Kantenbezeichnungen:
// Kante dritte Ebene - Knoten vierte Ebene - Kantenbezeichnungen
edge [
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:
headlabel
mit einen Namen - Beschriftung am Kanten- bzw. Pfeilende:
taillabel
mit einen Namen - Schriftfarbe der Beschriftung:
labelfontcolor
mit Werten als Farbname, als HSB-Tripel mit Werten zwischen0
und1
oder als RGB-Tripel mit Hexadezimalwerten zwischen00
undFF
- Schriftgröße der Beschriftung:
labelfontsize
mit einem Zahlenwert
Hier der Code für die Labelgröße, Labelfarbe und Farbe:
// Kante dritte Ebene - Knoten vierte Ebene - Labelgroesse
edge [
arrowhead="none",
arrowtail="inv",
headlabel="",
taillabel="Labelgroesse",
labelfontcolor="crimson",
labelfontsize="15"];
"labelfontsize"--"Zahlenwert, z.B. 15";
// Kante dritte Ebene - Knoten vierte Ebene - Labelfarbe
edge [
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 - Kantenformat
edge [
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 - Ausrichtung
edge [
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:
headport
mit den Werten (n
|ne
|e
|se
|s
|sw
|w
|nw
) - Ausrichtung von Kanten- bzw. Pfeilende:
tailport
mit 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:
Schreibe einen Kommentar