Создание легенды/ключа в GraphViz

Мне нравится включать легенду или ключ в диаграмму GraphViz. Тем не менее, мне трудно понять, какой код использовать. Я также хочу поставить его в угол, но единственная координация, которую я знаю наверняка, находится внизу слева: pos="10,10!".

Кто-нибудь знает, как я могу заставить это работать?

Ответ 1

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

Я использовал dot.

Ответ 2

Я глубоко убежден, что Graphviz не следует использовать таким образом, но вы можете использовать HTML-метки. достичь того, чего вы хотите:

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

То, что это выглядит:

graphviz output

позиционирование Легенды должно выполняться, как и любое другое node (я использовал ранец = раковина, чтобы довести его до конца) - вы можете играть с его атрибутом margin для штрафа -установка позиции.

Edit

Без использования меток, для которых может быть направлено - я не уверен, полностью ли исключить 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;
 }

Результат:

enter image description here

Ответ 3

Есть некоторые проблемы, если вы используете график [splines=ortho]: строки находятся в обратном порядке.

Точечный источник:

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

Ответ 4

Мне повезло со следующим. Мне не нравилось, насколько он широк, но в остальном это сработало.

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

Результат был

Result

Ответ 5

Я пытаюсь сделать то же самое. Я использовал подграф, чтобы сделать ключ типов узлов:

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

что приводит к

Graph with legend for node types

Но поразмыслив, видя трудность, с которой мне приходится располагать легенду рядом с основным графиком, то, как положение ранжирования узлов на основном графике влияет на положение легенды, и сложность источника, который это представляет, я соблазн попробовать другой подход (см. мой другой ответ, используйте отдельный график для ключа)

Ответ 6

Попробовав несколько способов встраивания ключа в основное изображение graphviz, я решил, что для меня имеет смысл просто поместить легенду в отдельный отдельный файл точек, отобразить ее в виде собственного, отдельного изображения и затем отображать изображения бок о бок в моих документах/страницах.

Это имеет несколько преимуществ:

а) Исходный код .dot существенно проще. б) Очень легко изменить rankdir графа легенды, чтобы отображать узлы друг над другом или рядом, чтобы получить ключ, который либо находится справа от основного изображения, либо под ним. в) Нет утечки таких вещей, как ранговые позиции из основного графика в легенду.

Например:

Graph of nodes Horizontal legend