2013-10-21 18 views
7

Sto provando a creare una legenda/chiave in Graphviz che contiene, non solo testo, ma nodi e spigoli. Mentre ho letto this post, la tabella HTML non sembra funzionare con quello che sto cercando di fare.Legenda Graphviz/Chiave con nodi

In questo momento, il codice che sto usando è:

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"]; 

} 

Il risultato di questo codice è:

The result of this code is

ma vorrei qualcosa di più come questo - preferibilmente di dimensioni più piccola:

ebut I would like something more like

risposta

9

Non eri lontano. Con alcuni piccoli aggiustamenti ho ottenuto il seguente risultato:

enter image description here

Il cambiamento più importante che ho fatto era uso rank=source invece di rank=min per ottenere i nodi allineati correttamente.

Per correggere l'allineamento del testo ho usato \r per allineare il testo a destra (\l fa lo stesso ma a sinistra) e dare tutti i nodi in testo in chiaro della stessa larghezza.

L'intero codice simile a questo (ho aggiunto alcuni commenti in cui ho fatto i cambiamenti):

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"]; 

} 

Su un lato nota, il codice potrebbe essere ripulito un po 'mettendo tutte le nodi in chiaro insieme, quindi gli attributi non dovrebbero essere dichiarati più spesso. Ciò avrebbe il vantaggio aggiuntivo dei nodi e l'attributo di rango non essere suddiviso in parti diverse del codice:

{ 
     rank=source 
     node [shape=plaintext, style=solid, width=3.5] 

     k1 [label="Required Course\r"] 
     k2 [label="Course 1 is a prerequisite for Course 2\r"] 
     k3 [label="Course 1 and Course 2 are corequisite\r"] 
     k4 [label="You must take either Course 1 OR\rCourse 2 before taking Course 3\r"] 
    }