レポートとかで有向グラフを書きたいとき、ペイントでやるのは汚いし、時間かかるしで困っていた。
で、それを解決してくれる「Graphviz」というツールがあるらしい。
Graphvizは次のURLからインストーラをダウンロード可能(windows版)。
http://www.graphviz.org/Download_windows.php
(MacOS、Linux版については別途用意されているけど、それはコマンドでインストールしたほうがいいかも。詳しくは、ググればたくさんでてくる。)
以下2.38版での説明。
主に使いそうなのは以下の2つ
dotty.exe:GUIでグラフ描写できる。ただ書きづらそう
gvedit.exe:dotファイルを編集し、グラフを画像として保存、表示する
dotファイルでの基本的な書き方
グラフの種類 グラフ名 {
graph [属性="値"; …];
node [属性="値"; …];
edge [属性="値"; …];
"ノードA"->"ノードB" [属性 = "値"; …];
"ノードA"--"ノードB" [属性 = "値"; …];
:
}
- グラフの種類:digraph(有向グラフ)または、graph(無向グラフ)
- グラフ名:適当でいいが、グルーピングするときなどに使うらしい
- ○○[属性="値"; …]:○○(グラフ、ノード、エッジなど)について、属性とその値を一括で決めることができる。属性は、shape、label、style、color、fillcolorなどがある。
- ノード -> ノード:ノード間を→で結ぶ。無向グラフなら--で記述する。
例えば、単に
graph sample{
A -- B;
A -- C;
A -- D;
B -- E;
}
と書いたら、以下のようなグラフが生成されるけど、もっと複雑になるときに、
ノードやエッジをあらかじめ、先に定義しといたほうが後々記述が楽になる・・と思う

あと、ラベル名を日本語にしたい時は、ノードのfontname属性をmeiryoとかで指定してやる。
名前が同じノードなんだけど、違うノードとして扱いたいときは、
node1[label = "ノード名"] node2[label = "ノード名"]
とでもしてやればいい。
最後に、最近の課題で作ったコードを少しいじったやつとそのグラフを載せて、作成例として終わる。年齢、収入、貯金という属性で株をやっているかどうかというグラフ。
digraph sample{
node[fontname="meiryo"];
edge[fontname="meiryo"];
age[label = "年齢"];
savings[label = "貯蓄"];
income[label = "収入"];
n10[label = "無"];
a4_50[label = "有"];
in_high[label = "有"];
in_low[label = "無"];
sa_high[label = "有"];
sa_low[label = "無"];
age -> n10[label = "10代"];
age -> income[label = "20代"];
age -> savings[label = "30代"];
age -> a4_50[label = "40代"];
age -> a4_50[label = "50代"];
income -> in_high[label = "high"];
income -> in_low[label = "low"];
savings -> sa_high[label = "high"];
savings -> sa_low[label = "low"];
}
