graphviz

Graphviz 使いかた

http://www.graphviz.org/

グラフ自動生成ツール

日本語のマニュアルが見付からなかったので自分が使うところだけをまとめてみ る。

もちろん超意訳なので間違いが多々あると思いますので御了承下さい。(という かそんなにまじめに訳していない)


各種ツールの位置付け

dotファイルは同じだけれど、これら各種グラフごとにレイアウトが異なる。


マニュアル

コマンドライン解説

 % dot [-(G|N|E)name=value]  [-Tlang] [-l libfile] [-o outfile] [-v] [-V] [files]

コマンド実行例

  % dot -T png test.dot > test.png

環境変数



まずなにから?

例 1

digraph test {
// comment
  node [shape = doublecircle] a b ;
  node [shape = circle] c;

  a[label = "start"];
  a -> b;
  b -> c[label="test"];
  c -> a;
}

解説

なお、labelなどはUTF-8にすれば、日本語も使える。らしい。

例 2

graph G {
  size="10,10";
  node [shape = egg] "begin node" "second node";
  node [shape = house] "last";
  node [shape = plaintext] d;

  d [label="stop"];

  "begin node" -- {"second node" d};
  "second node" -- "last";
  "last" -- "begin node"[label="back",len=2.0];
}

解説



もう少し詳しく

グラフ属性

graphvizにおける全ての属性値はname-valueのペアで表される。ノードabcの fillcolorをredに設定するには以下のように書く。

 abc[fillcolor = red]
同じようにエッジabcの矢印の形を設定するには以下のようにする。
  abc -> def [arrowhead = diamond]
この記法(dot言語)について詳しくはこっちを http://www.graphviz.org/cvs/doc/info/lang.html

以降述べる解説で使われる文字の意味は以下の通り。

良く使いそうな属性を抜き出してみた

これからgraphvizを使っていって徐々に追加していきます。

URL

label

任意の文字列でラベルを付ける。

arrowhead

エッジの矢印の頭の形を指定する。

arrowtail

エッジの矢印の尻尾の形を指定する。

constraint

falseだったらそのエッジはノードのランクに使われない。つまり、ノードの位 置が変わる。

len

エッジの長さを指定する。

root

これが指定されたノードは、レイアウトの中心に位置される。これはdotではな くcircoを使った場合のみ。

rankdir

rankdir=LRにするとcircleを除いて左から右へと描かれる。デフォルトでは上か ら下に描かれる。

他にはBT(下から上)、RL(右から左)なども指定できる。

- 使用される場所:

- 使用される場所:

ノードの形

多角形

参考: http://www.graphviz.org/cvs/doc/info/shapes.html

というか、見た方が早い

Labelが書かれてる形

shapeをrecordとし、labelを定義することでノードの中に(結構複雑に)段組みが かける。

digraph structs {
  node [shape=record]; 
  struct1 [label="<f0>left|<f1> mid\ dle|<f2> right"]; 
  struct2 [label="<f0>one|<f1> two"];
  struct3 [label="hello\nworld |{ b |{c|<here>d|e}| f}| g | h"];
  struct1:f1 -> struct2:f0;
  struct1:f2 ->struct3:here; 
} 

横に並べるには'|'で区切る。

   test[shape=record, label="a|b|c"];

縦に並べるには{}で囲み、さらに'|'で区切る

   class[shape=record, label="{class|variables|methods}"];

それぞれの囲みにはラベルが付けられる(とかがそう)。エッジを指定すると きにnode:f1とかと指定することでその部分に対してエッジをひける。

HTML

LabelとしてHTMLもかける

矢印の形

http://www.graphviz.org/cvs/doc/info/arrows.html

以下の文字を加えることで矢印をさらに変えることができる

例えば

 lteeoldiamond
これはl、tee、o、diamondに分割されて解釈される。

いっぱい http://www.graphviz.org/cvs/doc/info/colors.html

subgraph

graphの中にgraphも置ける。subgraphの中は別のgraphとして計算されて構築される。

digraph G {
  subgraph cluster_0 {
    style=filled;
    node [style=filled,color=white];
    a0 -> a1 -> a2 -> a3;
    label = "process #1";
  }

  subgraph cluster_1 {
    style=filled;
    node [style=filled,color=white];
    b0 -> b1 -> b2 -> b3;
    label = "process #2";
  }

  start -> a0;
  start -> b0;
  start [shape=Mdiamond];
}

サンプル

from http://www.research.att.com/sw/tools/graphviz/examples/

例1

digraph finite_state_machine {
    rankdir=LR;
    size="8,5"
    orientation=land;
    node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8;
    node [shape = circle];
    LR_0 -> LR_2 [ label = "SS(B)" ];
    LR_0 -> LR_1 [ label = "SS(S)" ];
    LR_1 -> LR_3 [ label = "S($end)" ];
    LR_2 -> LR_6 [ label = "SS(b)" ];
    LR_2 -> LR_5 [ label = "SS(a)" ];
    LR_2 -> LR_4 [ label = "S(A)" ];
    LR_5 -> LR_7 [ label = "S(b)" ];
    LR_5 -> LR_5 [ label = "S(a)" ];
    LR_6 -> LR_6 [ label = "S(b)" ];
    LR_6 -> LR_5 [ label = "S(a)" ];
    LR_7 -> LR_8 [ label = "S(b)" ];
    LR_7 -> LR_5 [ label = "S(a)" ];
    LR_8 -> LR_6 [ label = "S(b)" ];
    LR_8 -> LR_5 [ label = "S(a)" ];
}

例2

graph ER {
node [shape=box]; course; institute; student;
node [shape=ellipse]; {node [label="name"] name0; name1; name2;}
code; grade; number;
node [shape=diamond,style=filled,color=lightgrey]; "C-I"; "S-C"; "S-I";

name0 -- course;
code -- course;
course -- "C-I" [label="n",len=1.00];
"C-I" -- institute [label="1",len=1.00];
institute -- name1;
institute -- "S-I" [label="1",len=1.00];
"S-I" -- student [label="n",len=1.00];
student -- grade;
student -- name2;
student -- number;
student -- "S-C" [label="m",len=1.00];
"S-C" -- course [label="n",len=1.00];

label = "\n\nEntity Relation Diagram\ndrawn by NEATO";
fontsize=20;
}