ちょっと話題の記事

テキストデータをグラフ画像に変換するツール「Graphviz」ことはじめ

2017.09.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

森永です。

「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
}

dot01-strict

graphは無向グラフを書く際に必要な終端記号ですが、strictは無くてもグラフを生成できます。
strict無しで生成すると、

graph {
  a -- b
  b -- a
}

dot01

ノード間を繋ぐ線が2本になります。
strictはコネクション(ノードを繋ぐ線)の重複を許さない場合に使用します。
無向グラフの場合はだいたい付けておくことになると思います。

有向グラフ

次は、関係だけでなく方向性も示す有向グラフです。
ノード間を左から右に->でつなぎます。(右から左に<-は出来ません。)
そして、有向グラフを書く際にはgraphではなくdigraphを使います。

digraph {
 a -> b
 b -> a
}

dot02

ノードのスタイル変更

デフォルト設定は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
}

dot03

ちなみに上記のようにコメントを入れることも可能です。
//#で1行コメント、/* */で複数行コメントが可能です。

最後に

ひとまず今回はここまでにします。
属性値や機能が多すぎてドキュメントを読むだけで日が暮れてしまいます。。。

リソースの可視化の自動化などに活用出来そうなのでもう少し触ってみようと思います!

参考文献