Erstellen einer Legende / eines Schlüssels in GraphViz

76

Ich möchte eine Legende oder einen Schlüssel in mein GraphViz-Diagramm aufnehmen. Ich habe jedoch Probleme herauszufinden, welchen Code ich verwenden soll. Ich möchte es auch in eine Ecke stellen, aber der einzige Koordinat, den ich sicher kenne, ist der unten links : pos="10,10!".

Weiß jemand, wie ich das zum Laufen bringen kann?

Synetech
quelle

Antworten:

54
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]
  }
  ...

Geben Sie hier die Bildbeschreibung ein

Ich habe benutzt dot.

Mark Rajcok
quelle
2
Seltsam; Ich habe das mit dot(andere waren schlimmer).
Synetech
@Synetech, ich verwende GraphViz 2.28 (wenn das wichtig ist). Es scheint seltsam, dass key2in Ihrem Diagramm angezeigt wird.
Mark Rajcok
Es könnte; Ich benutze 2.26.3. Ich werde die neueste Version ausprobieren.
Synetech
@Synetech, FYI, ich habe dies auf einem Windows7-PC mit 2.26.3 versucht und das key2Problem reproduziert . Ich habe diesen PC (auf Version 2.30.1) aktualisiert und jetzt funktioniert es.
Mark Rajcok
2
Es hat bei mir funktioniert, aber ich musste "{rank = same; key, key2}" hinzufügen, um beide Enden auf den gleichen Rang zu bringen. Ohne das hatte ich komisch aussehende Pfeile.
Olivier Boudry
29

Ich bin fest davon überzeugt, dass graphviz nicht auf diese Weise verwendet werden sollte, aber Sie können HTML-Labels verwenden , um das 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>
   >];
  }
} 

So sieht das aus:

graphviz Ausgabe

Die Positionierung der Legende muss wie bei jedem anderen Knoten erfolgen (ich habe rank = sink verwendet, um sie nach unten zu bringen) - Sie können mit ihrem marginAttribut spielen, um die Position zu optimieren.

Bearbeiten :

Ohne die Verwendung von Etiketten könnte dies die richtige Richtung sein - ich bin mir nicht sicher, ob es vollständig beseitigt werden soll ranksep.

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;
 }

Ergebend:

Geben Sie hier die Bildbeschreibung ein

marapet
quelle
Das sieht in Bezug auf das Layout gut aus, erfordert jedoch die manuelle Eingabe jedes Elements in der Tabelle, anstatt die vorhandenen Knotenobjekte zu verwenden. Bei meinem Versuch wurden Untergraphen und Cluster ausprobiert, aber keiner war zuverlässig genug, um das Layout der Tabelle zu steuern (ich verstehe, dass die Engine für die Entscheidung über das optimale Layout eines normalen Diagramms verantwortlich ist, aber eine Tabelle ist einfach optimal zu gestalten, keine ausgefallene Berechnung sollte erforderlich sein; ein Rechteck ist einfach genug).
Synetech
1
Mir war nicht bewusst, dass die Legende aus Knoten bestehen musste - ich habe die Antwort mit einem Beispiel aktualisiert, das in diese Richtung geht, ohne Erfolg, zumindest wenn Sie die Gitterlinien benötigen. Ich denke nicht, dass das, was Sie erhalten möchten, möglich ist, selbst mit ausgefallenen Berechnungen. Andere Tools sind möglicherweise besser für diese Aufgabe geeignet.
Marapet
2
> Mir war nicht bewusst, dass die Legende aus Knoten bestehen musste. Nun, in der Legende geht es um das Diagramm, und das Diagramm besteht aus Knoten und Linien. > Ich denke nicht, dass das, was Sie erhalten möchten, möglich ist, selbst mit ausgefallenen Berechnungen. Andere Tools sind möglicherweise besser für diese Aufgabe geeignet. Das wäre unglücklich; Es erscheint seltsam, dass ein Grafikdienstprogramm keinen entscheidenden Teil eines Diagramms bereitstellen kann. :(
Synetech
1
Es wäre ein nützlicher Nachtrag, um aufzuzählen, warum Sie zutiefst davon überzeugt sind, dass dies nicht getan werden sollte.
Davos
4

Ich hatte etwas Glück mit Folgendem. Ich mochte nicht, wie breit es war, aber sonst funktionierte es.

   subgraph cluster1 {
        label = "Legend" ;
        shape=rectangle ;
        color = black ;
        a [style=invis];
        b [style=invis] ;
        c [style=invis] ;
        d [style=invis] ;
        c -> d [label="only ts", style=dashed, fontsize=20] ; 
        a -> b [label="ts and js", fontsize=20] ;
        gui -> controller [style=invis] ;
        view -> model [style=invis] ;
        builtins -> utilities [style=invis] ;

        gui [style=filled, fillcolor="#ffcccc"] ;
        controller [style=filled, fillcolor="#ccccff"] ;
        view [style=filled, fillcolor="#ccffcc"] ;
        model [style=filled, fillcolor="#ffccff"] ;
        builtins [style=filled, fillcolor="#ffffcc"] ;
        utilities ;
        "external libraries" [shape=rectangle] ;
    }

Das Ergebnis war

Ergebnis

Theodore Norvell
quelle
2

Bei Verwendung des Diagramms treten einige Probleme auf [splines=ortho]: Die Linien sind in umgekehrter Reihenfolge.

Punktquelle:

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]
  }
}
luandrea
quelle
2

Nachdem ich verschiedene Möglichkeiten ausprobiert habe, einen Schlüssel in das Hauptbild von graphviz einzubetten, habe ich beschlossen, dass es für mich sinnvoller ist, die Legende einfach in eine eigene, separate Punktdatei zu legen und sie als eigene, separate, Bild- und Bilddatei zu rendern Zeigen Sie dann die Bilder nebeneinander in meinen Dokumenten / Seiten an.

Dies hat einige Vorteile:

a) Der .dotQuellcode ist wesentlich einfacher. b) Es ist sehr einfach, das Rangverzeichnis des Legendengraphen so zu ändern, dass die Knoten übereinander oder nebeneinander angezeigt werden, um einen Schlüssel zu erzeugen, der sich entweder rechts vom Hauptbild oder darunter befindet. c) Kein Verlust von Dingen wie Rangpositionen aus dem Hauptdiagramm in die Legende.

Zum Beispiel:

Diagramm der Knoten Horizontale Legende

Jonathan Hartley
quelle
1

Ich versuche das Gleiche zu tun. Ich habe einen Untergraphen verwendet, um einen Schlüssel für Knotentypen zu erstellen:

digraph G {

    rankdir=RL;
    graph [fontsize=10 fontname="Verdana"];

    node [style=filled height=0.55 fontname="Verdana" fontsize=10];
    subgraph cluster_key {
        label="Key";
        progress [fillcolor="wheat" label="In progress"];
        todo [label="To do"];
        done [fillcolor=palegreen3 label="Done"];
        not_our [fillcolor=none label="Not our\nteam"];
        numbers [color=none label="Numbers\nrepresent\nperson\ndays"];
        progress -> done [style=invis];
        todo -> progress [style=invis];
        not_our -> todo [style=invis];
        numbers -> not_our [style=invis];
    }
    mappings [fillcolor=palegreen3];
    identifiers [fillcolor=palegreen3];
    hyperwarp [fillcolor=wheat];
    ghost [fillcolor=none]
    UI [fillcolor=none]
    events [fillcolor=wheat];
    flag [fillcolor=palegreen3];
    groups [fillcolor=wheat];
    types [fillcolor=wheat];
    instances [];
    resources [];
    optimize [];
    remove_flag [];
    persist [];
    approval [];

    edge [style="" dir=forward fontname="Verdana" fontsize=10];
    types -> flag;
    groups -> events;
    events -> {flag mappings identifiers};
    ghost -> hyperwarp;
    UI -> ghost;
    resources -> identifiers;
    optimize -> groups;
    hyperwarp -> flag;
    instances -> {ghost UI types events hyperwarp flag};
    resources -> {groups flag};
    remove_flag -> approval;
    persist -> approval;
    approval -> {types resources instances};
}

was in ... endet

Diagramm mit Legende für Knotentypen

Aber angesichts der Schwierigkeit, die ich habe, die Legende neben dem Hauptdiagramm zu positionieren, der Art und Weise, wie sich die Position der Knotenrangfolgen im Hauptdiagramm auf die in der Legende auswirkt, und der Komplikation in der Quelle, die dies einführt, bin ich versucht, einen anderen Ansatz zu versuchen (siehe meine andere Antwort, verwenden Sie ein separates Diagramm für den Schlüssel)

Jonathan Hartley
quelle