2013-10-21 12 views
7

Ich versuche, eine Legende/Schlüssel in Graphviz zu erstellen, die nicht nur Text, sondern Knoten und Kanten enthält. Während ich this post gelesen habe, scheint die HTML-Tabelle nicht mit dem zu funktionieren, was ich versuche zu tun.Graphviz Legende/Schlüssel mit Knoten

Gerade jetzt, der Code ich verwende ist:

digraph G { 
fontname="Helvetica"; 
labelloc=t; 
rankdir=LR; 
label="Course Graph"; 

node[style=filled, fontname="Helvetica", colorscheme=greens3, color=1]; 

subgraph cluster_key { 
    rank=min; 

    label="Key"; 
    rankdir=LR; 

    kc1[label="Course", peripheries=2, color=2]; 
    k1[shape=plaintext, style=solid, label="Required Course"] 
    prereq[label="Course 1"]; 
    kc2[label="Course 2"]; 
    prereq->kc2; 
    k2[shape=plaintext, style=solid, label="Course 1 is a prerequisite for Course 2"] 
    coreq1[label="Course 1"]; 
    coreq2[label="Course 2"]; 
    coreq1->coreq2[dir=both]; 
    k3[shape=plaintext, style=solid, label="Course 1 and Course 2 are corequisite"] 

    or[style="dashed", color="black", shape="diamond", label="OR"]; 
    or1[label="Course 1"]; 
    or1 -> or[style="dashed", dir="none"]; 
    or2[label="Course 2"]; 
    or2 -> or[style="dashed", dir="none"]; 
    kc3[label="Course 3"] 
    or->kc3; 
    k4[shape=plaintext, style=solid, label="You must take either Course 1 OR\nCourse 2 before taking Course 3"] 
    { rank=min;k1 k2 k3 k4 } 
} 

c3[color=3, peripheries=2]; 
c4[color=3, peripheries=2]; 

c1->c2[dir=both]; 
c2->c3; 

c4_reqs[style="dashed", color="black", shape="diamond", label="OR"]; 
c4_reqs->c4; 
c2->c4_reqs[style="dashed", dir="none"]; 
c5->c4_reqs[style="dashed", dir="none"]; 

} 

Das Ergebnis dieses Codes ist:

The result of this code is

aber ich möchte mehr so ​​etwas wie diese - vorzugsweise kleiner dimensioniert:

ebut I would like something more like

Antwort

9

Sie waren nicht weit entfernt. Bei einigen kleineren Anpassungen habe ich folgendes Ergebnis:

enter image description here

Die wichtigste Änderung war ich Gebrauch rank=source statt rank=min, um die Knoten zu erhalten korrekt aufgereiht.

Um die Textausrichtung zu beheben, habe ich \r verwendet, um den Text nach rechts auszurichten (\l macht das gleiche, aber auf der linken Seite) und geben alle Klartextknoten die gleiche Breite.

Der gesamte Code sieht wie folgt aus (ich habe noch einige Kommentare, wo ich die Änderungen):

digraph G { 
    fontname="Helvetica"; 
    labelloc=t; 
    rankdir=LR; 
    label="Course Graph"; 

    node[style=filled, fontname="Helvetica", colorscheme=greens3, color=1]; 

    subgraph cluster_key { 
     //rank=min; /* this doesn't really do anything for you */ 

     label="Key"; 
     //rankdir=LR; /* this is also not needed*/ 

     kc1[label="Course", peripheries=2, color=2]; 
     k1[shape=plaintext, style=solid, label="Required Course\r", width=3.5] // Add fixed width so all nodes line up 

     prereq[label="Course 1"]; 
     kc2[label="Course 2"]; 
     prereq->kc2; 
     k2[shape=plaintext, style=solid, label="Course 1 is a prerequisite for Course 2\r", width=3.5] // Add fixed width 

     coreq1[label="Course 1"]; 
     coreq2[label="Course 2"]; 
     coreq1->coreq2[dir=both]; 
     k3[shape=plaintext, style=solid, label="Course 1 and Course 2 are corequisite\r", width=3.5] // Add fixed width 

     or[style="dashed", color="black", shape="diamond", label="OR"]; 
     or1[label="Course 1"]; 
     or1 -> or[style="dashed", dir="none"]; 
     or2[label="Course 2"]; 
     or2 -> or[style="dashed", dir="none"]; 
     kc3[label="Course 3"] 
     or->kc3; 
     k4[shape=plaintext, style=solid, label="You must take either Course 1 OR\rCourse 2 before taking Course 3\r", width=3.5] // Add fixed width 

     { rank=source;k1 k2 k3 k4 } // Use "source in stead of min 
    } 

    c3[color=3, peripheries=2]; 
    c4[color=3, peripheries=2]; 

    c1->c2[dir=both]; 
    c2->c3; 

    c4_reqs[style="dashed", color="black", shape="diamond", label="OR"]; 
    c4_reqs->c4; 
    c2->c4_reqs[style="dashed", dir="none"]; 
    c5->c4_reqs[style="dashed", dir="none"]; 

} 

Auf einer Seite zur Kenntnis, könnte der Code ein wenig gereinigt werden, indem alle der Platzierung Klartextknoten zusammen, so dass Attribute nicht öfter deklariert werden müssten. Dies hätte den zusätzlichen Vorteil, dass die Knoten und das Rangattribut nicht in verschiedene Teile im Code aufgeteilt werden: