DOT言語
DOT は、プレーンテキストを用いてデータ構造としてのグラフを表現するための、データ記述言語の一種である。コンピュータで処理しやすく、かつ目で見ても分かり易い、単純化された形式でグラフを記述することができる。DOT言語で書かれたデータのファイルは、拡張子として .dot を付けることが多い。
DOT言語の処理系は多数実装されているが、どれもDOT言語の記述をファイルから読み込み、画像を生成するか、グラフを操作することができるようになっている。そのひとつ dot はドキュメンテーションジェネレータのdoxygenで使われている。dot は Graphviz パッケージの一部である。
目次 |
文法 [編集]
グラフの種類 [編集]
無向グラフ [編集]
DOT言語で記述できるもっとも単純なグラフは、無向グラフである。無向グラフでは、ノード間の関係 (たとえばある特定の二人が友人である、といった関係) の有無だけを表す。DOT言語のキーワード graph が置かれたところから、波括弧で挟まれた場所の間に、グラフを記述する。二重ハイフン (--) でノード間に関係がある (エッジがある) ことを示す。
graph graphname { a -- b -- c; b -- d; }
有向グラフ [編集]
フローチャートや木構造のような有向グラフも、無向グラフと同様に記述できる。記述の仕方は無向グラフとほとんど同じだが、記述を始めるところに置くキーワードは graph ではなく digraph であり、二重ハイフンの代わりに -> でエッジを示す。
digraph graphname { a -> b -> c; b -> d; }
属性 [編集]
ノードとエッジには様々な属性を設定することができる。色、形、線種などの属性を、属性の名前と、その値を対にして角括弧でかこみ、文の末尾 (でセミコロンの前) に置くことで、その文に書かれているノードやエッジの属性が指定される。複数の属性の設定をコンマか空白で区切って並べておくことができる。ノードの設定はノード名だけを含みエッジに関する記述を含まない文で設定される。
graph graphname { // The label attribute can be used to change the label of a node a [label="Foo"]; // Here, the node shape is changed. b [shape=box]; // These edges both have different line properties a -- b -- c [color=blue]; b -- d [style=dotted]; }
コメント文 [編集]
DOT言語では C や C++ 風の、1行あるいは複数行にわたるコメント文を置くことができる。さらに行頭に # が置かれた行も、コメント文として無視される。
// This is a single line comment. /* This is a multiple line comment. */ # Lines like this are also ignored.
簡単な例 [編集]
以下に、エタン分子の結合構造を記述する例を示す。これは無向グラフであり、上で述べた方法でエッジに属性を付けている。
graph ethane { C_0 -- H_0 [type=s]; C_0 -- H_1 [type=s]; C_0 -- H_2 [type=s]; C_0 -- C_1 [type=s]; C_1 -- H_3 [type=s]; C_1 -- H_4 [type=s]; C_1 -- H_5 [type=s]; }
描画プログラム [編集]
DOT言語ではグラフを定義する記述ができるが、定義されたグラフを描画する方法は言語自体には備わっていない。そのためのソフトウェアもいくつか実装されており、グラフを描画、あるいは操作することができる。
- Graphviz
- グラフを操作、描画するためのライブラリとユーティリティ・プログラムのパッケージ。
- Grappa
- Graphviz を使い Java 言語で実装された、グラフを編集、描画するプログラム。
- Tulip
- DOT言語を読み込んで解析することができる。
- OmniGraffle
- 部分的にだがDOT言語を読み込んで編集することができる (しかしそれをDOT形式で出力することはできない)。
- ZGRViewer
- GraphViz/DOT を表示できる。ウェブページ
- VizierFX
- グラフ描画ライブラリ。ウェブページ
問題点 [編集]
DOT言語ではグラフのレイアウトを細かく指定できるが、処理系によっては、図形の位置が正しく取り扱えない場合があることがある。処理系に依存するが、図形の自動配置アルゴリズムに頼れないような場合 (描画されるグラフが期待通りではないとき) には、ノードの配置を細かく指定する必要があるかもしれない。
以下に例を示す。
digraph g { node [shape=plaintext] A1 -> B1 A2 -> B2 A3 -> B3 A1 -> A2 [label=f] A2 -> A3 [label=g] B2 -> B3 [label="g'"] B1 -> B3 [label="(g o f)'" tailport=s headport=s] { rank=same; A1 A2 A3 } { rank=same; B1 B2 B3 } }
上の例では、期待通りになっていないところが2箇所ある。右半分はきれいな正方形になっておらず、エッジのラベル "(g o f)'" がおかしな場所に描かれている。
これは Inkscape などの SVG 形式を編集できるソフトウェアで修正できる。場合によっては、DOT言語中で pos 属性を使って修正することもできる。
関連項目 [編集]
- Graphviz
- グラフ
- lisp2dot - LISPに類する言語のプログラム木構造をDOT言語に変換する。遺伝的プログラミングに使われる。