読者です 読者をやめる 読者になる 読者になる

8t's BBR

よくつまったあれこれをメモ

Graphviz超入門

レポートとかで有向グラフを書きたいとき、ペイントでやるのは汚いし、時間かかるしで困っていた。
で、それを解決してくれる「Graphviz」というツールがあるらしい。


Graphvizは次のURLからインストーラをダウンロード可能(windows版)。
http://www.graphviz.org/Download_windows.php
MacOSLinux版については別途用意されているけど、それはコマンドでインストールしたほうがいいかも。詳しくは、ググればたくさんでてくる。)


以下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;
}

と書いたら、以下のようなグラフが生成されるけど、もっと複雑になるときに、
ノードやエッジをあらかじめ、先に定義しといたほうが後々記述が楽になる・・と思う
f:id:ykng0:20160711141654p:plain


あと、ラベル名を日本語にしたい時は、ノードの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"];
}

f:id:ykng0:20160711145112p:plain