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)
#ref(http://reddog.s35.xrea.com/img/graphviz-test.gif,nolink,left)

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

ほとんど同じだけどレイアウトの仕方が違うdottyとlneatoがある。
dottyはPEAT図というか有向グラフで、lneatoは無向グラフで使うのがいいと思う。
レイアウトの仕方が違う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      ,矢印のサイズ
,arrowhead      ,辺の開始点の矢印のスタイル normal none
,arrowtail      ,辺の終了点の矢印のスタイル normal none
,arrowsize      ,矢印のサイズ
,color          ,矢印の色
,constraint     ,辺をノードのランキングで使う(true/false)
,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
,weight         ,辺の重み付け デフォルトで1。二つの枝の重いほうが真横(真下)に来る。
-グラフの属性
,bgcolor      ,背景色
,color        ,アウトラインなどの色
,fillcolor    ,塗りつぶし色
,fontcolor    ,文字色
,fontname     ,フォント
,fontsize     ,フォントサイズ
,fontpath     ,フォントを探すパス
,rankdir      ,LR(left-right)か、TB(top-bottom)
#,clusterrank  ,global local none
,ranksep      ,ノード間の距離。デフォは0.75
,splines      ,スプラインで描画(true/false)
,overlap      ,重ねて描画(true/false)
,orientation  ,portrait/landscape
,ratio        ,fill/auto/compress

***日本語 [#r73d2ece]
dottyで日本語を表示することはできない(ようだ)が、dotから出力する画像ファイルで日本語を出力することは可能。バージョンはGraphviz2.6。以下そのやりかた。~
+dotファイルをUTF-8で書く。fontnameにTTFのファイル名の拡張子を除いたものを書く。Windows2000の場合、C:\WINNT\FONTにパスが通ってるので、適当に見繕ってARIALUNI.TTFを使って見る。
 g{}
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]
    "五代" -- "響子" -- "一ノ瀬" -- "五代";
    "三鷹" -- "響子";
    "一ノ瀬" -- "三鷹";
    "音無家" -- "響子"
    "明日菜" -- "三鷹";
    "九条家" -- "明日菜";
    "三鷹家" -- "三鷹";
    "九条家" -- "三鷹家";
    "こずえ" -- "五代";
    "八神" -- "五代";
 }
+普通に出力
 neato -Tgif test.dot -o test.gif
 dot -Kneato -Tgif test.dot -o jpfont.gif
#ref(jpfont.gif,nolink,left)

***日本語その2 [#g5a1862a]
#ref(dotty.gif,nolink,left)
leftyの改造によるdottyの日本語入力。

***dot言語 [#af2d6cfc]
//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特有の文字化けを解消することができないので、内部コードをUFT-8化するか、エスケープする処理を加えるかしなければならない。UTF-8化する場合、組み込みのパーサーの書き換えやソースコードの文字コードの変更をしなければならない可能性もあるのでめんどくさそう。描画直前にUnicodeに変換してDrawTextWで描画する方法もあるけどうーむ。
まだ改造途中でshiftjis特有の文字化けが残っている。たとえば、表示が侮ヲになったりするので、「set label=日本語\\\表示」みたいに特定の文字をエスケープしてやらないといけない。あとファイルの入出力もshiftjisで、dottyに直接食わせることができるのがutf-8なので、この辺もutf-8に統一したほうがよい。内部コードをutf-8に統一するのが一番近道のような気がするが・・・めんどくさそうだったのでとりあえず放置して様子見中。
-パッチ~
http://reddog.s35.xrea.com/software/graphviz-win-jp.patch
-バイナリ(置き換えてください)~
http://reddog.s35.xrea.com/software/lefty-jp.zip

***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};
というふうにまとめて書ける。

***Dot言語の書きかた [#a443fb99]

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

***コメントをどーぞ [#uf3b3ae9]
-dottyの使いかたで「右クリックでノードの追加」とありますが、当方の環境では 左クリックでした。 --  &new{2005-09-23 19:41:05 (金)};
-すいません間違えていました。ご指摘ありがとうございます。 -- [[reddog]] &new{2005-09-23 21:58:52 (金)};
-"惣一郎"ノードも欲しいですね ;-) --  &new{2005-10-06 21:14:04 (木)};
-dottyの日本語入力するための方法を教えていただけるとありがたいです -- [[とおりすがり]] &new{2005-11-01 20:30:53 (火)};
-allowhead,allowtail,allowsizeはarrowhead,arrowtail,arrowsizeの間違いでは? -- [[none]] &new{2005-11-10 17:40:25 (木)};
-直しました。すいません。 -- [[reddog]] &new{2005-11-10 18:02:13 (木)};
-画像の直リンクは迷惑なのでしないでください。 -- [[reddog]] &new{2006-02-24 23:12:31 (金)};
//#comment
----
[[CategoryTclTk]]


HTML convert time: 0.017 sec.