拡張子 | .gv .dot |
---|---|
MIMEタイプ | text/vnd.graphviz [1][2] |
種別 | データ記述言語 |
ウェブサイト | https://graphviz.org/doc/info/lang.html |
DOTとは、データ記述言語の一種で、グラフをデータ構造としてプレーンテキストで表現するための言語である。 コンピュータで処理しやすく、読みやすいように簡略化した形式でグラフを記述する。 DOTで書かれたデータのファイルには、しばしば .gv または .dot という拡張子が付けられる(Microsoft Word 2007以前で使われていた拡張子 .dot (Wordテンプレートファイル)との混乱を避けるため、拡張子 .gv が好ましい。[3])。
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.
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言語ではグラフを定義する記述ができるが、定義されたグラフを描画する方法は言語自体には備わっていない。そのためのソフトウェアもいくつか実装されており、グラフを描画、あるいは操作することができる。
Chrome拡張。SVG、PNGへ出力できる。
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 属性を使って修正することもできる。