Graphviz超入門
レポートとかで有向グラフを書きたいとき、ペイントでやるのは汚いし、時間かかるしで困っていた。
で、それを解決してくれる「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"]; }