2010-08-17 13 views
49

Ich möchte eine Legende oder einen Schlüssel in mein GraphViz-Diagramm einfügen. Ich habe jedoch Probleme herauszufinden, welchen Code ich verwenden soll. Ich möchte es auch in eine Ecke stellen, aber die einzige Koordinate, die ich sicher kenne, ist die links unten: pos="10,10!".Erstellen einer Legende/eines Schlüssels in GraphViz

Weiß jemand, wie ich das zur Arbeit bringen kann?

Antwort

23

Ich bin zutiefst davon überzeugt, dass graphviz sollte nicht auf diese Weise verwendet werden, aber Sie können HTML labels verwenden, um zu erreichen, was Sie wollen:

digraph { 

Foo -> Bar -> Test; 
Foo -> Baz -> Test; 

{ rank = sink; 
    Legend [shape=none, margin=0, label=< 
    <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4"> 
    <TR> 
     <TD COLSPAN="2"><B>Legend</B></TD> 
    </TR> 
    <TR> 
     <TD>Foo</TD> 
     <TD><FONT COLOR="red">Foo</FONT></TD> 
    </TR> 
    <TR> 
     <TD>Bar</TD> 
     <TD BGCOLOR="RED"></TD> 
    </TR> 
    <TR> 
     <TD>Baz</TD> 
     <TD BGCOLOR="BLUE"></TD> 
    </TR> 
    <TR> 
     <TD>Test</TD> 
     <TD><IMG src="so.png" SCALE="False" /></TD> 
    </TR> 
    <TR> 
     <TD>Test</TD> 
     <TD CELLPADDING="4"> 
     <TABLE BORDER="1" CELLBORDER="0" CELLSPACING="0" CELLPADDING="0"> 
     <TR> 
     <TD BGCOLOR="Yellow"></TD> 
     </TR> 
     </TABLE> 
     </TD> 
    </TR> 
    </TABLE> 
    >]; 
    } 
} 

Das ist, wie das aussieht:

graphviz output

Die Positionierung der Legende muss wie jeder andere Knoten getan werden (ich habe rank = sink verwendet, um es zu bekommen nach unten) - Sie können mit dem Attribut margin spielen, um die Position zu optimieren.

bearbeiten:

Ohne Etiketten verwendet wird, dass die Richtung zu gehen sein kann - ich bin nicht sicher, ob es ranksep vollständig zu beseitigen ist.

digraph { 
mindist=0; 
ranksep=0; 
nodesep=0; 

node[shape=box,margin="0,0",width=1, height=0.5]; 
edge [style=invis]; 

Legend[width=2]; 
Legend -> Foo; 
Legend -> FooValue; 
Foo -> Bar; 
FooValue -> BarValue 
Bar -> Baz; 
BarValue -> BazValue; 

edge [constraint=false]; 
Foo -> FooValue; 
Bar -> BarValue 
Baz -> BazValue; 
} 

in Resultierende:

enter image description here

+0

dass in Bezug auf das Layout sieht gut aus, aber es erfordert manuell jedes Element in der Tabelle mit den vorhandenen Knoten Objekte im Gegensatz eingeben. Mein Versuch versuchte Subgraphen und Cluster, aber beide waren nicht zuverlässig genug, um das Layout der Tabelle zu steuern (ich verstehe, dass die Engine verantwortlich ist für die Entscheidung über das optimale Layout eines normalen Graphen, aber eine Tabelle ist einfach zu Layout optimal, keine Phantasie Berechnung sollte benötigt werden, ein Rechteck ist einfach genug). – Synetech

+1

Mir war nicht bewusst, dass die Legende aus Knoten bestehen musste - ich aktualisierte die Antwort mit einem Beispiel in diese Richtung, ohne Erfolg, zumindest wenn Sie die Gitterlinien brauchen. Ich glaube nicht, dass das, was Sie erhalten möchten, auch mit ausgefallenen Berechnungen möglich ist. Andere Werkzeuge können für diese Aufgabe besser geeignet sein. – marapet

+2

**> Ich war mir nicht bewusst, dass die Legende aus Knoten bestehen musste. Nun, die Legende handelt von der Grafik, und die Grafik besteht aus Knoten und Linien. **> Ich glaube nicht, dass das, was Sie erhalten möchten, auch mit ausgefallenen Berechnungen möglich ist. Andere Werkzeuge könnten für diese Aufgabe besser geeignet sein. ** Das wäre bedauerlich; Es ist seltsam, dass ein Graphik-Dienstprogramm keinen entscheidenden Teil eines Graphen darstellen kann. :( – Synetech

37
digraph { 
    rankdir=LR 
    node [shape=plaintext] 
    subgraph cluster_01 { 
    label = "Legend"; 
    key [label=<<table border="0" cellpadding="2" cellspacing="0" cellborder="0"> 
     <tr><td align="right" port="i1">item 1</td></tr> 
     <tr><td align="right" port="i2">item 2</td></tr> 
     <tr><td align="right" port="i3">item 3</td></tr> 
     <tr><td align="right" port="i4">item 4</td></tr> 
     </table>>] 
    key2 [label=<<table border="0" cellpadding="2" cellspacing="0" cellborder="0"> 
     <tr><td port="i1">&nbsp;</td></tr> 
     <tr><td port="i2">&nbsp;</td></tr> 
     <tr><td port="i3">&nbsp;</td></tr> 
     <tr><td port="i4">&nbsp;</td></tr> 
     </table>>] 
    key:i1:e -> key2:i1:w [style=dashed] 
    key:i2:e -> key2:i2:w [color=gray] 
    key:i3:e -> key2:i3:w [color=peachpuff3] 
    key:i4:e -> key2:i4:w [color=turquoise4, style=dotted] 
    } 
    ... 

enter image description here

I verwendet dot.

+2

Seltsam; Ich habe [diese] (http://i.stack.imgur.com/jztgt.png) mit 'dot' (andere waren schlechter). – Synetech

+0

@Synetech, ich benutze GraphViz 2.28 (wenn das wichtig ist). Es erscheint seltsam, dass 'key2' in Ihrem Diagramm angezeigt wird. –

+0

Es könnte; Ich benutze 2.26.3. Ich werde die neueste Version versuchen. – Synetech

1

Es gibt einige Probleme, wenn Sie Graph [splines=ortho] verwenden: die Zeilen sind in umgekehrter Reihenfolge.

Dot Quelle:

digraph { 
    rankdir=LR 
    node [shape=plaintext] 
    graph [splines=ortho] 
    subgraph cluster_01 { 
    label = "Legend"; 
    key [label=<<table border="0" cellpadding="2" cellspacing="0" cellborder="0"> 
     <tr><td align="right" port="i1">item 1</td></tr> 
     <tr><td align="right" port="i2">item 2</td></tr> 
     <tr><td align="right" port="i3">item 3</td></tr> 
     <tr><td align="right" port="i4">item 4</td></tr> 
     <tr><td align="right" port="i5">item 5</td></tr> 
     </table>>] 
    key2 [label=<<table border="0" cellpadding="2" cellspacing="0" cellborder="0"> 
     <tr><td port="i1" bgcolor='greenyellow'>&nbsp;</td></tr> 
     <tr><td port="i2">&nbsp;</td></tr> 
     <tr><td port="i3">&nbsp;</td></tr> 
     <tr><td port="i4">&nbsp;</td></tr> 
     <tr><td port="i5">&nbsp;</td></tr> 
     </table>>] 
    key:i1:e -> key2:i1:w [color=red] 
    key:i2:e -> key2:i2:w [color=gray] 
    key:i3:e -> key2:i3:w [color=peachpuff3] 
    key:i4:e -> key2:i4:w [color=turquoise4, style=dotted] 
    key:i5:e -> key2:i5:w [color=red, style=dotted] 
    } 
}