IT Share you

GraphViz에서 범례 / 키 만들기

shareyou 2020. 12. 1. 20:03
반응형

GraphViz에서 범례 / 키 만들기


GraphViz 다이어그램에 범례 또는 키를 포함하고 싶습니다. 그래도 사용할 코드를 파악하는 데 문제가 있습니다. 나는 또한 그것을 구석에 놓고 싶지만 내가 확실히 아는 유일한 좌표는 왼쪽 하단 pos="10,10!"입니다.

아무도 내가 이것을 작동시킬 수있는 방법을 알고 있습니까?


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.


저는 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 출력

Legend 위치 는 다른 노드와 마찬가지로 수행해야합니다 (순위 = 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;
 }

를 야기하는:

여기에 이미지 설명 입력


그래프를 사용하면 몇 가지 문제가 있습니다 [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]
  }
}

나는 다음과 함께 약간의 운이 좋았습니다. 나는 그것이 얼마나 넓은 지 좋아하지 않았지만 그렇지 않으면 작동했습니다.

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

결과는

결과


메인 graphviz 이미지에 키를 삽입하는 여러 가지 방법을 시도한 후, 저는 단순히 범례를 별도의 자체 도트 파일에 넣고 자체적으로 렌더링하고 별도의 이미지로 렌더링하는 것이 더 합리적이라고 결정했습니다. 그런 다음 내 문서 / 페이지에 이미지를 나란히 표시합니다.

여기에는 몇 가지 장점이 있습니다.

a) .dot소스 코드가 훨씬 더 간단합니다. b) 범례 그래프의 rankdir을 변경하여 노드를 서로 위에 표시하거나 나란히 표시하여 기본 이미지의 오른쪽 또는 아래에있는 키를 생성하는 것은 매우 쉽습니다. c) 주 그래프에서 범례로 순위 위치와 같은 항목이 누출되지 않습니다.

예를 들면 :

노드 그래프 수평 범례


저도 똑같이하려고합니다. 노드 유형의 키를 만들기 위해 하위 그래프를 사용하고 있습니다.

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

결과적으로

노드 유형에 대한 범례가있는 그래프

그러나 생각해 보면, 메인 그래프와 함께 범례를 배치해야하는 어려움, 메인 그래프의 노드 순위 위치가 범례의 노드 순위에 영향을 미치는 방식, 이것이 소개하는 소스의 복잡성을 보면 다른 접근 방식을 시도하고 싶었습니다 (다른 답변 참조, 키에 대해 별도의 그래프 사용)

참고 URL : https://stackoverflow.com/questions/3499056/making-a-legend-key-in-graphviz

반응형