Создание легенды / ключа в GraphViz - PullRequest
61 голосов
/ 17 августа 2010

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

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

Ответы [ 6 ]

49 голосов
/ 29 марта 2013
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.

27 голосов
/ 21 января 2011

Я глубоко убежден, что не следует использовать 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

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

Редактировать

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

2 голосов
/ 09 апреля 2013

При использовании графика [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]
  }
}
1 голос
/ 07 февраля 2019

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

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

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

Например:

Graph of nodes Horizontal legend

1 голос
/ 07 февраля 2019

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

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

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

1 голос
/ 12 сентября 2018

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

   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

...