Створення легенди / ключа в GraphViz


76

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

Хтось знає, як я можу змусити це працювати?

Відповіді:


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

введіть тут опис зображення

Я використовував dot.


2
Дивно; Я отримав це з dot(інші були гіршими).
Synetech 30.03.13

@Synetech, я використовую GraphViz 2.28 (якщо це важливо). Здається дивним, що key2відображається на вашому графіку.
Марк Райчок

Це могло б; Я використовую 2.26.3. Я спробую останню версію.
Synetech 31.03.13

@Synetech, FYI, я спробував це на ПК з ОС Windows7 під управлінням 2.26.3 і відтворив key2проблему. Я оновив цей ПК (до версії 2.30.1), і тепер він працює.
Марк Райчок

2
Це спрацювало для мене, але мені довелося додати "{rank = same; key, key2}", щоб змусити обидва кінці знаходитися в одному рангу. Без цього у мене були кумедні на вигляд стрілки.
Олів'є Будрі,

29

Я глибоко переконаний, що 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

Позиціонування легенди має бути зроблено , як і будь-який інший вузол (я використовував ранг = тонути , щоб отримати його на дно) - ви можете грати з його 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;
 }

В результаті:

введіть тут опис зображення


Це виглядає добре з точки зору макета, але для цього потрібно ввести кожен елемент у таблицю вручну, на відміну від використання існуючих об’єктів вузла. Моя спроба спробувала підграфи і кластери, але жоден з них не був достатньо надійним для управління розташуванням таблиці (я розумію, що механізм відповідає за прийняття рішення про оптимальне розміщення звичайного графіка, але таблицю легко розмістити оптимально, без вигадливих розрахунків потрібно; прямокутник досить простий).
Synetech

1
Я не знав, що легенда повинна складатися з вузлів - я оновив відповідь прикладом, який рухався в цьому напрямку, але безуспішно, принаймні, якщо вам потрібні лінії сітки. Я не думаю, що те, що ви хотіли б отримати, можливо навіть при химерних розрахунках. Інші інструменти можуть бути більш придатними для цього завдання.
marapet

2
> Я не знав, що легенда повинна складатися з вузлів. Ну легенда стосується графіка, а графік складається з вузлів і ліній. > Я не думаю, що те, що ви хотіли б отримати, можливо навіть при химерних розрахунках. Інші інструменти можуть бути більш придатними для цього завдання. Це було б прикро; здається дивним, що утиліта графіки не може надати важливу частину графіку. :(
Synetech

1
Було б корисним додатком перелічити, чому ви глибоко впевнені, що цього робити не слід.
Давос,

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

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

Результат


2

Якщо ви використовуєте графік, є деякі проблеми [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]
  }
}

2

Спробувавши декілька способів вбудування ключа в основне зображення graphviz, я вирішив, що для мене є більш розумним просто помістити легенду у свій окремий точковий файл, зробити його власним, окремим, зображенням та потім відображати зображення поряд у моїх документах / сторінках.

Це має кілька переваг:

а) .dotВихідний код істотно простіший. б) Дуже легко змінити рангдир графіка легенди для відображення вузлів один над одним або поруч, щоб створити ключ, який знаходиться або праворуч від основного зображення, або під ним. в) Відсутність витікання таких речей, як позиції рангу з основного графіку в легенду.

Наприклад:

Графік вузлів Горизонтальна легенда


1

Я намагаюся зробити те саме. Я використовував підграф для створення ключа типів вузлів:

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

в результаті чого

Графік із легендою для типів вузлів

Але, роздумуючи, побачивши труднощі, з якими мені доводиться розміщувати легенду поряд з основним графіком, те, як позиція рейтингу вузлів у головному графіку впливає на легенди, та ускладнення у джерелі, яке це вводить, я спокуса спробувати інший підхід (див. іншу мою відповідь, використовуйте окремий графік для ключа)


0
subgraph cluster_01 {
    label = "Legend";
    node [shape=point]
    {
        rank=same
        d0 [style = invis];
        d1 [style = invis];
        p0 [style = invis];
        p1 [style = invis];
        s0 [style = invis];
        s1 [style = invis];
    }
    d0 -> d1 [label=deprecated style=dashed]
    p0 -> p1 [label=proposed style=dotted]
    s0 -> s1 [label=stable]
}

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.