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
#+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
#+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
:file とか :cmdline とかの意味や、その他のオプションについては org-modeドキュメントの 14 Working with source code を参照すること。
ちなみに、org-mode内で#+begin_src~#+end_srcを入力するには、行頭で <s TAB と打つと良い。
3 そもそもdotってどう書くのさ
- チュートリアル:http://homepage3.nifty.com/kaku-chan/graphviz/index.html
- 構文:http://www.graphviz.org/content/dot-language
- 属性:http://www.graphviz.org/content/attrs
基本となるコンセプトは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
サブグラフは一番最初に指定したグラフの種類になる。
言語仕様によるとサブグラフは三つの役割があるらしい。
- グラフ構造を表すため
- 設定属性のための文脈を提供するため
- クラスター (clusterで始まる名前のサブグラフは特別に扱われる)
4 inline表示ができたらなぁ
生成された画像をインライン表示できないものだろうか。
#+begin_src dot :file dot_example4.png
digraph {
node [fontname="MS Gothic"];
"努力"->"成功";
"金"->"成功";
};
#+end_src
[[./dot_example4.png]]
こうすると(画像が生成された後ならば)C-c C-x C-vでインライン表示できるが、ソースブロックの結果と重複してしまう。
:exportsではcode、results、both、noneのいずれを指定してもうまくいかなかった。特にnoneでは評価されず、画像自体が生成されなかった。