AT&Tのオープンソースでグラフ構造を描画するツール。
dot言語を用いて記述する。
Doxygenなんかで関数呼び出しやクラスの関連図の可視化にも使われているようだ。
A→B, B→C, C→Aの辺を持つ有向グラフの描画
test.dot
digraph "g" { "A" -> "B" ; "B" -> "C" ; "C" -> "A" ; }
で、test.dotをdottyかlneatoに食わせると新しいウィンドウで描画する。
ファイルに書き出すときは、
dot -Kneato -Tgif test.dot -o test.gif
引数の-Kはレイアウトエンジンでcirco, dot, fdp, neato, twopiの5つのどれか。-Tは出力ファイルのフォーマットでdot, gif, jpg, png, ps, svgとか色々ある。
dottyは対話的にノードや辺を追加してグラフを描画するツール。
レイアウトの仕方が違うdottyとlneatoがある。実はleftyを実行するラッパーなので、次のようにleftyをコマンドラインから呼び出しても同じ。上がdottyで下がlneato。
lefty -e load('dotty.lefty');dotty.simple(null); lefty -e load('dotty.lefty');dotty.protogt.lserver='neato';dotty.simple(null);
dottyはPEAT図とか有向グラフで、lneatoは無向グラフで使うのがいいと思う。
よく使いそうなのをピックアップ。マニュアルにもっと載ってる。
label | ラベル |
color | 色 |
fillcolor | 背景色 |
fontcolor | 文字色 |
fontsize | フォントサイズ |
fontname | font family |
shape | ellipse circle doublecircle polygon box point diamond |
regular | shape=polygon時に正n角形にする。(true/false) |
sides | shape=polygon時の辺の数 |
distortion | shape=polygon時に台形にする(0.0~) |
skew | shape=polygon時に斜めにする(0.0~) |
orientation | ノードの回転 |
style | bold dotted filled |
arrowhead | 辺の開始点の矢印のスタイル normal none |
arrowtail | 辺の終了点の矢印のスタイル normal none |
arrowsize | 矢印のサイズ |
color | 矢印の色 |
dir | forward back both none |
fontcolor | フォントの色 |
fontname | font family |
fontsize | フォントサイズ |
headlabel | head側に置くラベル |
taillabel | tail側に置くラベル |
label | ラベル |
labelfontcolor | ラベルの色 |
style | bold dotted filled |
constraint | 辺をノードのランキングの計算で使うかどうか(true/false) |
minlen | 辺の最小の長さ デフォルトで1 |
weight | 辺の重み付け デフォルトで1。二つの枝の重いほうが真横(真下)に来る。 |
bgcolor | 背景色 |
color | アウトラインなどの色 |
fillcolor | 塗りつぶし色 |
fontcolor | 文字色 |
fontname | フォント |
fontsize | フォントサイズ |
fontpath | フォントを探すパス |
rankdir | LR(left-right)か、TB(top-bottom) |
ranksep | ノード間の距離。デフォは0.75 |
splines | スプラインで描画(true/false) |
overlap | 重ねて描画(true/false) |
orientation | portrait/landscape |
ratio | fill/auto/compress |
Windows版のdottyで日本語を表示することはできない(ようだ)が、dotから出力する画像ファイルで日本語を出力することは可能。バージョンはGraphviz2.6。以下そのやりかた。
graph "g" { node [shape=circle, fontname="arialuni.ttf", fontsize=10, width=0.5, margin=0.0] edge [minlen=5] "五代" -- "響子" -- "一ノ瀬" -- "五代"; "三鷹" -- "響子"; "一ノ瀬" -- "三鷹"; "音無家" -- "響子" "明日菜" -- "三鷹"; "九条家" -- "明日菜"; "三鷹家" -- "三鷹"; "九条家" -- "三鷹家"; "こずえ" -- "五代"; "八神" -- "五代"; }
dot -Kneato -Tgif test.dot -o jpfont.gif
leftyの改造によるdottyの日本語入力。
まだ改造途中でshiftjis特有の文字化けが残っている。たとえば、表示が侮ヲになったりするので、「set label=日本語\\\表示」みたいに特定の文字をエスケープしてやらないといけない。あとファイルの入出力もshiftjisで、dottyに直接食わせることができるのがutf-8なので、この辺もutf-8に統一したほうがよい。内部コードをutf-8に統一するのが一番近道のような気がするが・・・めんどくさそうだったのでとりあえず放置して様子見中。
digraph g { 1 -> 2 -> 3; {rank=same; 1 A B C;} {rank=same; 2 D E F;} {rank=same; 3 G H I;} }
digraph g { subgraph cluster1 { label=cluster1; A B C; } subgraph cluster2 { label=cluster2; D E F; } A -> E -> D A -> C -> F }
n0 -> n1 n0 -> n2 n0 -> n3というのは
n0 -> {n1 n2 n3};というふうにまとめて書ける。