org-modeでGraphviz(dot)を使う

org-modeでGraphviz(dot)を使えるようにしたいので使い方を勉強することにした。dotは簡単なテキスト記述からグラフ の図を生成するツールだ。

Table of Contents

1 Graphvizのインストール

肝心のGraphvizが入っていないといけない。

http://www.graphviz.org/Download..php

ダウンロードしてインストールするだけ。 パスが通っていればコマンドラインからdot –helpでヘルプが出る。

Emacs側では org-babel-load-languages の設定にdotを加えておく。

ちなみに、これを記述している時点のEmacsとOrgModeのバージョンは次の通り。

emacs-version
GNU Emacs 23.3.1 (i386-mingw-nt6.1.7601) of 2011-08-15 on GNUPACK
org-version
Org-mode version 7.8.03

2 org-mode内での書き方

#+begin_src dot :file dot_example0.png
digraph {
  A->B;
}
#+end_src

dot_example0.png

#+begin_src dot :file dot_example1.png :cmdline -Kdot -Tpng
digraph {
  graph [fontname="MS Gothic"];
  node [fontname="MS Gothic"];
  edge [fontname="MS Gothic"];
  label = "有向グラフの例";
  "谷保" -> "立川" [label=南武線];
  "立川" -> "新宿" [label=中央線];
  "谷保" -> "分倍河原" [label=南武線];
  "分倍河原" -> "新宿" [label=京王線];
}
#+end_src

dot_example1.png

#+begin_src dot :file dot_example2.png
graph {
  graph [fontname="MS Gothic"];
  node [fontname="MS Gothic"];
  edge [fontname="MS Gothic"];
  label = "無向グラフの例";
  "谷保" -- "立川" -- "秋葉原";
  "谷保" -- "分倍河原" -- "新宿" -- "秋葉原";
  "谷保" [label="yaho"];
};
#+end_src

dot_example2.png

:file とか :cmdline とかの意味や、その他のオプションについては org-modeドキュメントの 14 Working with source code を参照すること。

ちなみに、org-mode内で#+begin_src~#+end_srcを入力するには、行頭で <s TAB と打つと良い。

3 そもそもdotってどう書くのさ

基本となるコンセプトはgraph、node、edgeの三つ。

graphクラス、nodeクラス、edgeクラスがあって、そのインスタンス(オブジェクト)をdotファイルで記述していくと考えると分かりやすいかもしれない。 graphオブジェクト、nodeオブジェクト、edgeオブジェクトをいろいろ定義して属性を設定していく感じ。

グラフを表す{から}の間にlabel = ID;のように書けば、そのグラフのlabel属性が ID になる。

エッジ文(構文 のedge_stmtの部分参照)の中に[label = ID ]のように書けば、そのエッジのlabel属性が ID になる。

ノード文(構文 のnode_stmtの部分参照)の中に[label = ID ]のように書けば、そのノードのlabel属性が ID になる。

ちなみに、ここで言う ID は基本的に任意の文字列と考えて良い。記号や予約語などは直接記述できないが、ダブルクォーテーションで囲めば書ける。

3.1 サブグラフは有向か無向か

#+begin_src dot :file dot_example3.png
digraph {
  graph [fontname="MS Gothic"];
  label = "clusterで始まっているものは外枠で囲われる";
  A->B;
  A->C;

  subgraph cluster1 {
    label = "sub1";
    1->2;
    1->3;
  }

  subgraph sub2 {
    label = "sub2";
    H--I;
    H--J;
  }
}
#+end_src

dot_example3.png

サブグラフは一番最初に指定したグラフの種類になる。

言語仕様によるとサブグラフは三つの役割があるらしい。

  • グラフ構造を表すため
  • 設定属性のための文脈を提供するため
  • クラスター (clusterで始まる名前のサブグラフは特別に扱われる)

4 inline表示ができたらなぁ

生成された画像をインライン表示できないものだろうか。

#+begin_src dot :file dot_example4.png
digraph {
  node [fontname="MS Gothic"];
  "努力"->"成功";
  "金"->"成功";
};
#+end_src

[[./dot_example4.png]]

dot_example4.png

./dot_example4.png

こうすると(画像が生成された後ならば)C-c C-x C-vでインライン表示できるが、ソースブロックの結果と重複してしまう。

:exportsではcode、results、both、noneのいずれを指定してもうまくいかなかった。特にnoneでは評価されず、画像自体が生成されなかった。

Date: 2012-05-22

Author: AKIYAMA Kouhei

Org version 7.8.03 with Emacs version 23

Validate XHTML 1.0