ケーズメモ このページをアンテナに追加 RSSフィード

2007-10-11

Graphvizの使い方メモ

はてブのじわじわきているエントリ辺りで

Graphviz チュートリアル

http://homepage3.nifty.com/kaku-chan/graphviz/

が出ていたのですが、バージョンが2.4とずいぶん古いものでした。少し前からGraphvizを使っているので自分のメモがてら最新バージョンでの使い方のメモを書いておこうと思います。

あくまで私がよく使う機能のメモなので完全なリファレンスGraphvizの公式ページのドキュメントを参照してください。今回使用したバージョンはWindows版の2.14.1(安定最新版)です。


インストール

まず、Graphvizを公式ページ

Graphviz

http://graphviz.org/

からGraphvizダウンロードします。対応OSWindows/Mac OSX/Linuxです。

Windowsの場合のインストール方法は

  1. 左サイドバーにある「Download」をクリック
  2. ページ最下部の「Agree」(ライセンス承諾などです)をクリック
  3. 「Stable and development Windows Install package」をクリック
  4. graphviz-2.14.1.exe」をクリックしてダウンロード

ダウンロード後はexeファイルをダブルクリックしてインストール

インストール後のチェックはコマンドプロンプトを開いてdot -Vを実行します。dotはコマンドプロンプトからGraphvizを使うためのコマンドです。-Vオプションはdot(Graphviz)のバージョンを表示させるものです。

>dot -V
dot - Graphviz version 2.14.1 (Thu Aug 16 12:22:16 UTC 2007)

となっていればインストール完了です。


基本の書き方

さて、グラフを書いてみましょう。これからの説明のために用語の解説をします。

f:id:ksmemo:20071013144209p:image

上図の楕円の要素をノードノードノードをつなぐ線(ここでは矢印)をエッジと呼びます。日本語訳は色々ありますが、私が知っているものはノードが節、エッジが辺または弧です。日本語だとばらつきがあるので以降ノードとエッジとして説明します。

グラフの基本の書き方は

グラフの種類 グラフ名 {
  graph [属性="値"; ...];
  node  [属性="値"; ...];
  edge  [属性="値"; ...];
  "ノードA"->"ノードB" [属性 = "値"; ...];
   もしくは
 "ノードA"--"ノードB" [属性 = "値"; ...];
  ...
}

です。各要素を細かく見ていくと

グラフの種類
有向グラフ*1であればdigraph(direct graph)、無向グラフ*2であればgraphを指定します
グラフ名
グラフの名前です。後々、グラフ同士をグルーピングするときなどに使います
node/edge [属性="値"; ...]
ノード/エッジに一括して属性を指定します
"ノードA"->"ノードB"
ノードAとノードBを矢印でつなぐ
"ノードA"--"ノードB"
ノードAとノードBを線でつなぐ

といったものです。さて、これで実際に簡単なグラフを書いてみます。一例としてノードとエッジの説明をしたグラフのdotファイルを紹介しましょう。

digraph g {
  node [fontname="MSGOTHIC.TTC"];
  edge [fontname="MSGOTHIC.TTC"];
  "ノードA"->"ノードB"[label="エッジ"];
}

node/edgeにしているfontoname属性については次にGraphvizで日本語を使う上での注意で説明します。

label属性はノードAからノードBへのエッジに対するラベル(表示名)を付けるものです。labelはエッジの中央に、headlabelはノードB寄り(矢印の先)に、taillabelはノードA寄り(矢印の根元)にラベルを表示します。


Graphvizで日本語を使う上での注意

最新版で日本語を使う上での注意点は以下

  1. dotファイルの文字コードUTF-8にする
  2. node/edgeにfontname属性を指定して、Graphvizで使うフォントを指定する

上記2点を守っていれば日本語が使えます(上で使ったものは実際に日本語が文字化けしていない)。

Windows 2000/XPフォントがあるフォルダ(C:\Windows\Fonts)にパスが通っているので、フォントのファイル名だけを指定してやればOKです。


dotファイルから出力を得る方法

Windowsの場合はGVUI.exeというGUIもあります。これで指定してもいいのですが、私はコマンドラインで使うのが好きなタイプなのでコマンドプロンプトでの実行方法を書きます。

>dot -K(レイアウトエンジン名) -T(出力形式) (dotファイル名) -o (出力ファイル名)
  • Kオプションは省略可能で、省略するとレイアウトエンジンがdotになります。

例えばこれまでに使ってきたdotファイルの名前がtest.dotで、出力をtest.pngにしたければ

>dot -Kdot -Tpng test.dot -o test.png

とします。古いバージョンではpngで問題があるようですが、現在は特に問題はありません。

レイアウトエンジンは5種類あります

dot
階層構造のレイアウト
neato, fdp
ばねアルゴリズムを使った配置。エッジをばねと見立てたとき、力の均衡が取れた状態のレイアウト
twopi
放射状のレイアウト
cicro
環状のレイアウト

あらかじめレイアウトの形状が決まっている場合にはdot以外のレイアウトを使うのも手ですが、通常使う場合にはdotで十分だと思います。

出力形式はdot -vで調べられます。

>dot -v
    render      :  canon cmap cmapx cmapx_np dia dot fig gd gd2 gif hpgl imap im
ap_np ismap jpeg jpg mif mp pcl pic plain plain-ext png ps ps2 svg svgz vml vmlz
 vrml vtx wbmp xdot
...
  • 主な画像出力形式では問題ありませんが、psps2での出力形式にUTF-8が使えない(つまり日本語が使えない)のは変わっていないようです。-

追記(2010/02/03)

psps2の場合は下記のオプションで大丈夫なようです(from はてブ)。

ps,ps2の場合は、"-Tps:cairo"と指定すれば日本語もOK

id:mkouheiさんありがとうございます。

*1:エッジが矢印、つまり向きに意味のあるもの

*2:エッジが線、つまり向きに意味が無いもの

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証