グラフ自動生成ツール
日本語のマニュアルが見付からなかったので自分が使うところだけをまとめてみ る。
もちろん超意訳なので間違いが多々あると思いますので御了承下さい。(という かそんなにまじめに訳していない)
dotファイルは同じだけれど、これら各種グラフごとにレイアウトが異なる。
% dot [-(G|N|E)name=value] [-Tlang] [-l libfile] [-o outfile] [-v] [-V] [files]
% dot -T png test.dot > test.png
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にすれば、日本語も使える。らしい。
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を使っていって徐々に追加していきます。
任意の文字列でラベルを付ける。
エッジの矢印の頭の形を指定する。
エッジの矢印の尻尾の形を指定する。
falseだったらそのエッジはノードのランクに使われない。つまり、ノードの位 置が変わる。
エッジの長さを指定する。
これが指定されたノードは、レイアウトの中心に位置される。これはdotではな くcircoを使った場合のみ。
rankdir=LRにするとcircleを除いて左から右へと描かれる。デフォルトでは上か ら下に描かれる。
他にはBT(下から上)、RL(右から左)なども指定できる。
参考: http://www.graphviz.org/cvs/doc/info/shapes.html
というか、見た方が早い
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}"];
それぞれの囲みにはラベルが付けられる(
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
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/
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)" ]; }
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; }