DOT言語

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

DOT は、プレーンテキストを用いてデータ構造としてのグラフを表現するための、データ記述言語の一種である。コンピュータで処理しやすく、かつ目で見ても分かり易い、単純化された形式でグラフを記述することができる。DOT言語で書かれたデータのファイルは、拡張子として .dot を付けることが多い。

DOT言語の処理系は多数実装されているが、どれもDOT言語の記述をファイルから読み込み、画像を生成するか、グラフを操作することができるようになっている。そのひとつ dotドキュメンテーションジェネレータdoxygenで使われている。dotGraphviz パッケージの一部である。

文法[編集]

グラフの種類[編集]

無向グラフ[編集]

無向グラフの例。

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言語では CC++ 風の、1行あるいは複数行にわたるコメント文を置くことができる。さらに行頭に # が置かれた行も、コメント文として無視される。

 // This is a single line comment.
 /* This is a
    multiple line
    comment. */
 # Lines like this are also ignored.

簡単な例[編集]

dotty を使ったスクリプト例による描画

以下に、エタン分子の結合構造を記述する例を示す。これは無向グラフであり、上で述べた方法でエッジに属性を付けている。

 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 属性を使って修正することもできる。

関連項目[編集]

外部リンク[編集]