AT&Tのオープンソースでグラフ構造を描画するツール。~
dot言語を用いて記述する。~
Doxygenなんかで関数呼び出しやクラスの関連図の可視化にも使われているようだ。
***簡単な使い方 [#e7ee2471]
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とか色々ある。
#ref(test.gif,nolink,left)

***dottyの使い方 [#ifb61a16]
dottyは対話的にノードや辺を追加してグラフを描画するツール。~
-右クリックでノードの追加
-ホイール長押し+ドラッグで辺の追加
-右クリックで色々メニューが出る。attrで属性の変更。

レイアウトの仕方が違う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は無向グラフで使うのがいいと思う。
***属性 [#kad57457]
よく使いそうなのをピックアップ。マニュアルにもっと載ってる。~
-ノードの属性
,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
-エッジの属性
,allowhead      ,辺の開始点の矢印のスタイル normal none
,allowtail      ,辺の終了点の矢印のスタイル normal none
,allowsize      ,矢印のサイズ
,color          ,矢印の色
,constraint     ,辺をノードのランキングで使う(true/false)
,dir            ,forward back both none
,fontcolor      ,フォントの色
,fontname       ,font family
,fontsize       ,フォントサイズ
,headlabel      ,head側に置くラベル
,taillabel      ,tail側に置くラベル
,label          ,ラベル
,labelfontcolor ,ラベルの色
,style          ,bold dotted filled
,minlen         ,辺の最小の長さ デフォルトで1
,weight         ,辺の重み付け デフォルトで1
-グラフの属性
,bgcolor      ,背景色
,color        ,アウトラインなどの色
,fillcolor    ,塗りつぶし色
,fontcolor    ,文字色
,fontname     ,フォント
,fontsize     ,フォントサイズ
,fontpath     ,フォントを探すパス
,rankdir      ,LR(left-right)か、TB(top-bottom)
,splines      ,スプラインで描画(true/false)
,overlap      ,重ねて描画(true/false)
,orientation  ,portrait/landscape
,ratio        ,fill/auto/compress

***日本語 [#r73d2ece]
Windows版のdottyで日本語を表示することはできない(ようだ)が、dotから出力する画像ファイルで日本語を出力することは可能。バージョンはGraphviz2.6。以下そのやりかた。~
+dotファイルをUTF-8で書く。fontnameにTTFのファイル名を書く。Windows2000の場合、C:\WINNT\FONTにパスが通ってるので、適当に見繕ってARIALUNI.TTFを使って見る。~
 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
#ref(jpfont.gif,nolink,left)

//***日本語その2 [#g5a1862a]
//leftyの日本語化(未完成)
//+graphviz-win-2.6/graphviz-win/cmd/lefty/ws/mswin32/lefty.rcでfontを決め打ちしてる個所を削除。
//+graphviz-win-2.6/graphviz-win/cmd/lefty/ws/mswin32/gcanvas.cとgpcanvas.cの//CreateFont()の部分をちゃんと書く。
//+dotty.leftyで日本語フォントをデフォルトにするよう変更する。
//このままではshiftjis特有の文字化けを解消することができないので、内部コードをUnicode化するか、エスケープする処理を加えるかしなければならない。Unicode化する場合、組み込みのパーサーの書き換えやソースコードの文字コードの変更をしなければならない可能性もあるのでめんどくさそう。描画直前にUnicodeに変換してDrawTextWで描画する方法もあるけどうーむ。
***dot言語メモ [#af2d6cfc]
-ノードのランクを同じにする
 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};
というふうにまとめて書ける。

***Tcl関連 [#ha63f75b]
-[[Package ASDOT:http://wiki.tcl.tk/3717]]~
Tcllibのstruct::graphとdot形式の相互変換。struct::graphのバージョンアップで挙動不審になってる気がする。簡単なdotを読み込めん。簡単な出力はできるようだ。

----
[[CategoryTclTk]]

HTML convert time: 0.011 sec.