マニュアル: Graphviz

投稿日: 更新日:

インストール

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

The DOT Language

定義: 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: 右寄せ & 改行
    • ドキュメントに出てくる&#92;nは、\nと同じです(ASCIIコードで92はバックスラッシュになる)
  • HTML形式
    • HTML-Like Labels
    • "でなく、<>で囲む。
    • ただ、自分の環境だとうまくいっていない(要調査)。

形(shape)

以下を参照。

外部サイト