テキストデータをグラフ画像に変換するツール「Graphviz」ことはじめ
森永です。
「Graphviz」というツールをご存知でしょうか。
DOT言語という言語で書かれたテキストを画像ファイルへと変換し出力するオープンソースのツールです。
リソースの可視化に使えそうだな、と思いドキュメントを読んで試してみたので使い方をまとめます。
Graphvizとは
Graphviz (Graph Visualization Software)とはグラフ作成用のツールです。
DOT言語と呼ばれるデータ記述言語を使って記述したテキストファイルを画像ファイルとして変換し出力することが出来ます。
様々なプラットフォーム(Windows、Mac OX、Linux)のバイナリが用意されています。
Download | Graphviz - Graph Visualization Software
試してみる
今回の検証環境は以下です。
$ sw_vers ProductName: Mac OS X ProductVersion: 10.12.6 BuildVersion: 16G29
インストール
Mac OS XではHomebrewが使えます。
$ brew install graphviz
以下のコマンドでバージョンが出ればOKです。
$ dot -V dot - graphviz version 2.40.1 (20161225.0304)
DOT言語基礎
DOT→画像変換
テキストファイルでDOT言語を記述したら以下のコマンドで画像ファイルに変換します。
他にもオプションがありますが今回は最低限のものだけご紹介します。
$ dot -Tsvg dot.gv -o dot.svg
-T
オプションは後ろに変換したい画像ファイルのフォーマットを指定します。
上の例ではsvg
ファイルに変換するというものです。
出力できるファイル形式は以下にあります。
gifやjpegはもちろん、PostScriptやPSDなんかにも変換することが出来ます。
Output Formats | Graphviz - Graph Visualization Software
-o
オプションは出力先の指定です。
無向グラフ
まずは関係性のみを示す無向グラフから。
ノードの間を--
(ハイフン2つ)で繋ぐだけで大丈夫です。
strict graph { a -- b b -- a }
graph
は無向グラフを書く際に必要な終端記号ですが、strict
は無くてもグラフを生成できます。
strict
無しで生成すると、
graph { a -- b b -- a }
ノード間を繋ぐ線が2本になります。
strict
はコネクション(ノードを繋ぐ線)の重複を許さない場合に使用します。
無向グラフの場合はだいたい付けておくことになると思います。
有向グラフ
次は、関係だけでなく方向性も示す有向グラフです。
ノード間を左から右に->
でつなぎます。(右から左に<-
は出来ません。)
そして、有向グラフを書く際にはgraph
ではなくdigraph
を使います。
digraph { a -> b b -> a }
ノードのスタイル変更
デフォルト設定はshape=ellipse, width=.75, height=.5
となっています。
shape
はノードの形を表します。
主要な形としては
- ellipse(楕円)
- box(箱型)
- circle(正円)
- plaintext(文字だけ)
- box3d(3Dの箱型)
その他、設定できる値はこちらに記載があります。
width
は横幅、height
は縦幅です。
shape
によって指定が変わってきます。
その他にもノードの線の色を表すcolor
、ノードのスタイルを表すstyle
、塗り色を表すfillcolor
などがあります。
属性値がものすごい量ありますので、気になる方はこちらを御覧ください。
digraph { /* DOT言語テスト ノードスタイルを変更してみる */ a [shape=box,width=1,color=red] // 箱型で幅が1、線の色が赤 b [shape=circle,style=dashed] // 正円で点線 c [shape=plaintext,fillcolor=yellow,style=filled] # 文字のみで黄色で塗りつぶし d [shape=box3d,height=1] # 3Dの箱型で高さが1 a -> b -> c b -> d }
ちなみに上記のようにコメントを入れることも可能です。
//
や#
で1行コメント、/* */
で複数行コメントが可能です。
最後に
ひとまず今回はここまでにします。
属性値や機能が多すぎてドキュメントを読むだけで日が暮れてしまいます。。。
リソースの可視化の自動化などに活用出来そうなのでもう少し触ってみようと思います!