インストール
macOSの場合
brew install graphviz
CLI
sample.gvを入力として、PNG画像を作成するには、以下のようにします。
dot -Tpng sample.gv -o sample.png
出力フォーマット
出力フォーマットはいろいろあります(詳細はman dot
)が、
PNG, JPEGといった画像はもちろん、
PDF、PostScript、DOT言語、JSONとかいろいろあります。
グラフの種類
コマンドを変えることで、出力が変わるようです。 それぞれアルゴリズムが違うようですが、試してみるのが早そうな感じです。
DOT言語
説明を見る限り、拡張子は’.gv’が使われているようです。 エンコーディングはデフォルトではUTF-8です。 デフォルトのフォントは環境によるのかもしれませんが、 macOSでは日本語のフォント(明朝体、詳細は不明)が使われていました。
graph
定義: graph : [ strict ] (graph | digraph) [ ID ] '{' stmt_list '}'
- strict: 複数の線が出るのを禁止する。
- graph: 無向グラフ。
->
を使うと文法エラーになる。 - digraph: 有向グラフ。
--
を使うと文法エラーになる。
無向、有向の混在はできませんが、回避策はあるようです。
ステートメント
定義(stmtの改行はスペースに置き換え)
stmt_list : [ stmt [ ';' ] stmt_list ]
stmt : node_stmt | edge_stmt | attr_stmt | ID '=' ID | subgraph
ノード(node_stmt)
定義は以下。
node_stmt : node_id [ attr_list ]
attr_list : '[' [ a_list ] ']' [ attr_list ]
a_list : ID '=' ID [ (';' | ',') ] [ a_list ]
言葉で書くとこんな感じです。
- ノードIDのあと、’[‘と’]‘で囲まれた属性のリストが追加されることがある。
- 属性のリストは、’,‘または’;‘区切りで、1つ1つは’属性名=属性値’として表される。
ちょっとややこしいですが、要は次のどちらでも書けるようです。
a [shape=box, style=filled, fillcolor=yellow]
b [shape=box] [style=filled, fillcolor=yellow]
エッジ(edge_stmt)
定義は以下(port, subgraphは後回し。。。)
edge_stmt : (node_id | subgraph) edgeRHS [ attr_list ]
edgeRHS : edgeop (node_id | subgraph) [ edgeRHS ]
node_id : ID [ port ]
- edgeopは
--
または->
です。
要はa -- b -- c
のように、次々とつなげて書けるようです。
サブグラフにつなげるためには、以下のようにltail, lheadあたりを 付けると良さそうです。
属性(attr_stmt)
定義は以下。グローバルに設定するためのものみたいです。
attr_stmt : (graph | node | edge) attr_list
- 使用例
node [shape=box]
: ノードを全て箱型にする
サブグラフ(subgraph)
定義は以下。
subgraph : [ subgraph [ ID ] ] '{' stmt_list '}'
- 名前が
cluster
から始まると、クラスタ化されたサブグラフになる。
- 名前が
使用例
subgraph cluster_0 { ... }
ポート(port)
定義は以下。どうやらどこから線を出すかどうかを決めるためのもののようです。
port : ':' ID [ ':' compass_pt ] | ':' compass_pt
以下のようにすると、東側(east)から線が出ます。
a -- b:e
属性
ラベル(label)
- パイプ(
|
)を使うと、区切り線になる。 {
と}
で囲むと、方向が変わる。- デフォルトは水平(左から右)のため、最初に使うと垂直(上から下)になる。
<f0>
のような記述はポートの定義になる。- エスケープシーケンス
- escString
\n
: センタリング & 改行\l
(Lの小文字): 左寄せ & 改行\r
: 右寄せ & 改行- ドキュメントに出てくる
\n
は、\n
と同じです(ASCIIコードで92はバックスラッシュになる)
- HTML形式
- HTML-Like Labels
"
でなく、<
と>
で囲む。- ただ、自分の環境だとうまくいっていない(要調査)。
形(shape)
以下を参照。