Graphvizとdot言語でグラフを描く方法のまとめ

  • 315
    いいね
  • 3
    コメント
この記事は最終更新日から1年以上が経過しています。

概要

Graphvizはdot言語で記述されたグラフ構造を任意のフォーマットの画像ファイルへ出力するツールです。
グラフ構造はdot言語でdotファイルというプレーンテキストに記述します。
この記事はdot言語でグラフを書く方法を簡単にまとめたものです。

環境

下記の環境で動作確認を行いました。

参考

下記のサイトを参考にさせて頂きました。

dot言語

dot言語では図形をノードと呼び、図形と図形の関連をエッジと呼びます。
ノードやエッジをどのような図形で表現するか、ラベルのフォントや色などをdot言語で記述します。
また同じdotファイルでも使用するレイアウトエンジンを変えることで異なる表現が可能です。
dot言語を使用すると下図ような図形を表現することができます。

sample_graph.png

この図は下記のdotファイルより生成しました。

example
digraph graph_name {
  graph [
    charset = "UTF-8";
    label = "sample graph",
    labelloc = "t",
    labeljust = "c",
    bgcolor = "#343434",
    fontcolor = white,
    fontsize = 18,
    style = "filled",
    rankdir = TB,
    margin = 0.2,
    splines = spline,
    ranksep = 1.0,
    nodesep = 0.9
  ];

  node [
    colorscheme = "rdylgn11"
    style = "solid,filled",
    fontsize = 16,
    fontcolor = 6,
    fontname = "Migu 1M",
    color = 7,
    fillcolor = 11,
    fixedsize = true,
    height = 0.6,
    width = 1.2
  ];

  edge [
    style = solid,
    fontsize = 14,
    fontcolor = white,
    fontname = "Migu 1M",
    color = white,
    labelfloat = true,
    labeldistance = 2.5,
    labelangle = 70
  ];

  // node define
  alpha [shape = box];
  beta [shape = box];
  gamma [shape = Msquare];
  delta [shape = box];
  epsilon [shape = trapezium];
  zeta [shape = Msquare];
  eta;
  theta [shape = doublecircle];

  // edge define
  alpha -> beta [label = "a-b", arrowhead = normal];
  alpha -> gamma [label = "a-g"];
  beta -> delta [label = "b-d"];
  beta -> epsilon [label = "b-e", arrowhead = tee];
  gamma -> zeta [label = "g-z"];
  gamma -> eta [label = "g-e", style = dotted];
  delta -> theta [arrowhead = crow];
  zeta -> theta [arrowhead = crow];
}

dotファイルの基本的な構造

example
// dotファイルはdigraphまたはgraphで始めます
// graph_nameはこの例でのグラフ名です。
digraph graph_name {

  //graph settings
  graph [
    // graphは予約語です。
    // ここにグラフ全体の設定を行います。
  ];

  // node common setting
  node [
    // nodeは予約語です。
    // ここで設定した属性はすべてのノードに反映されます。
    // ノードの共通の設定はここに記述します。
  ];

  // edge common setting
  edge [
    // edgeは予約語です。
    // ここで設定した属性はすべてのエッジに反映されます。
    // エッジの共通の設定はここに記述します。
  ];

  // define alpha node
  alpha [
    // alphaという名前はこの例で付けたノード名です。任意の名前を付けることができます。
    // ここにalphaノード固有の属性を設定します。
  ];

  // define beta node
  beta [
    // betaという名前はこの例で付けたノード名です。任意の名前を付けることができます。
    // ここにbetaノード固有の属性を設定します。
  ];

  // define gamma and delta, epsilon node
  gamma, delta, epsilon [
    // 複数のノードに同じ属性を設定したい場合はカンマで区切って定義します。
    // ここにgamma,delta, epsilonノードの属性を設定します。
  ];

  // define alpha-beta edge
  alpha -> beta [
    // ここにalphaからbetaのエッジ固有の属性を設定します。
  ];

  // define gamma-delta-epsilon edge
  gamma -> delta -> epsilon [
    // 複数のノードを繋げることで連続してエッジを定義することができます。
  ];

  // define subgraph
  subgraph cluster_sub1 [
     // ここにサブグラフの属性を設定します。
  ];

}
  • digraph : グラフの種類です。(digraph=有向グラフ、graph=無向グラフ)
  • graph_name : グラフの名前です。任意の名前をつけることが出来ます。
  • graph : グラフの属性値を設定します。
  • node : ここで設定する属性値は全てのノードに適用されます。
  • edge : ここで設定する属性値は全てのエッジに適用されます。

グラフの定義

グラフの定義と属性の設定は下記のようにgraphという名前の[ ]内に属性と値を記述することで行います。

example
digraph graph_name {
  graph [
    属性 = 値,
    属性 = 値,
    ...
  ];
}

layout

layout属性でレイアウトエンジンを指定することができます。
同じdotファイルでもlayoutを変えることによってさまざまなグラフを生成することができます。

layout description
circo 円形のグラフ.
dot 階層型のグラフ. 有向グラフ向き. デフォルトのレイアウトエンジン
fdp スプリング(ばね)モデルのグラフ. 無向グラフ向き.
neato スプリング(ばね)モデルのグラフ. 無向グラフ向き.
osage 配列型のグラフ.
sfdp fdpのマルチスケール版. 大きな無向グラフ向き.
twopi 放射型のグラフ. ノードは同心円状に配置される.
dot_file
digraph graph_name {
  graph [
    charset = "UTF-8";
    labelloc = "t",
    labeljust = "c",
    bgcolor = "#343434",
    fontcolor = white,
    fontsize = 18,
    style = "filled",
    rankdir = TB,
    margin = 0.2,
    layout = circo
//    layout = dot
//    layout = fdp
//    layout = neato
//    layout = osage
//    layout = sfdp
//    layout = twopi
  ];
  node [
    colorscheme = "rdylgn11"
    style = "solid,filled",
    fontsize = 14,
    fontcolor = 6,
    fontname = "Migu 1M",
    color = 7,
    fillcolor = 11
  ];
  edge [
    color = white
  ];

  alpha, beta, gamma , delta, epsilon, zeta, eta, theta;
  alpha -> beta;
  alpha -> gamma;
  alpha -> delta;
  alpha -> epsilon;
  alpha -> zeta;
  alpha -> eta;
  alpha -> theta;
  iota, kappa, lambda, mu, nu, xi;
  beta -> iota;
  beta -> kappa;
  gamma -> lambda;
  gamma -> mu;
  gamma -> nu;
  gamma -> xi;
  omicron, pi, rho;
  delta -> omicron;
  delta -> pi;
  delta -> rho;
  sigma, tau;
  epsilon -> sigma;
  epsilon -> tau;
}

このグラフは上記のdotファイルより生成しました。

layout graph
circo layout_circo.png
dot layout_dot.png
fdp layout_fdp.png
neato layout_neato.png
osage layout_osage.png
sfdp layout_sfdp.png
twopi layout_twopi.png

ノードの定義

もっとも簡単なノードの定義は下記のようにノード名を記述するだけです。

dot_file
digraph graph_name {
  alpha;
  beta;
}

node_def1.png

ノードの属性の設定は下記のようにノード名の後の[ ]内に属性と値を記述することで行います。

example
ノード名 [
  属性 = 値,
  属性 = 値,
  ...
];

主なノードの属性は下記のものがあります。

dot_file
digraph graph_name {
  alpha [
    label = "alpha node.",    //ノードラベル
    shape = box,              //ノードの形を指定する
    fixedsize = true,         //ノードの大きさを指定可能とする
    width = 1.5,              //ノードの幅(インチ)
    height = 1.2,             //ノードの高さ(インチ)
    style = "solid,filled"    //ノードの枠線のスタイルと塗つぶしの指定
    color = "#336666",        //ノードの枠線の色
    fillcolor = "#CC9999",    //ノードを塗りつぶす色
    fontname = "Migu 1M",     //ノードラベルフォント
    fontsize = 16,            //ノードラベルフォントサイズ
    fontcolor = blue          //ノードラベルフォントカラー
  ];
  beta;
}

node_def3.png

エッジの定義

エッジの定義は任意の2つのノードを->で繋げる事で行います。

dot_file
digraph graph_name {
  alpha;
  beta;
  alpha -> beta;
}

node_def2.png

また、複数のエッジをまとめて定義することができます。
この例ではdeltaノードは定義されていませんが、ノードが存在しない場合はノードの定義も同時に行われます。

dot_file
digraph graph_name {
  alpha;
  beta;
  alpha -> beta -> delta;
}

edge_def2.png

エッジの属性の設定は下記のようにエッジの定義の後の[ ]内に属性と値を記述することで行います。

example
ノード名1 -> ノード名2 [
  属性 = 値,
  属性 = 値,
  ...
];

主なエッジの属性は下記のものがあります。

dot_file
digraph graph_name {
  graph [
    ranksep = 1.1
  ];

  //node define
  alpha;
  beta;

  // edge define
  alpha -> beta [
    label = "a-b",            //エッジラベル
    labelfloat = true,        //ラベルの重なりを許可する
    headlabel = "head",       //エッジの終端にラベルをつける
    taillabel = "tail",       //エッジの始端にラベルをつける
    labeldistance = 2.5,      //ラベルの位置をノードからの距離で指定する
    labelangle = 70,          //ラベルの位置を角度で指定する
    color = blue,             //エッジカラー
    style = solid,            //エッジスタイル
    dir = both,               //エッジの矢印を指定する
    arrowhead = normal,       //エッジの終端の形状を指定
    arrowtail = normal,       //エッジの始端の形状を指定
    arrowsize = 1,            //矢印の大きさ倍率で指定
    weight = 5                //エッジの重み付け 重みが大きいエッジが結ぶノードがより近く配置される
    fontname = "Migu 1M",     //エッジラベルフォント
    fontsize = 14,            //エッジラベルフォントサイズ
    fontcolor = blue          //エッジラベルフォントカラー
  ];
}

edge_def3.png

下記のように複数のエッジの属性をまとめて設定することも可能です。

example
digraph graph_name {
  graph [rankdir = LR];
  node [shape = none];

  1 -> 2 -> 3 -> 4 [
    arrowhead = none
  ];
}

node

Node Shapes

主なノードの形状の種類は下記の通りです。(これで全てでは有りません。)

name desc
box 箱形
polygon 多角形
ellipse (default) 楕円
oval 卵型
circle
point
egg
triangle 三角形
plaintext テキスト
plain テキスト
diamond ダイヤモンド
trapezium 台形
parallelogram 平行四辺形
house
pentagon 五角形
hexagon 六角形
septagon 七角形
octagon 八角形
doublecircle 二重線の丸
doubleoctagon 二重線の八角形
tripleoctagon 三重線の八角形
invtriangle 逆三角形
invtrapezium 逆台形
invhouse 逆さの家
Mdiamond ダイヤモンド
Msquare 正方形
Mcircle
rect 長方形. boxのシノニム.
rectangle 長方形. boxのシノニム.
square 正方形
star
none 無し. plaintextのシノニム.
underline 下線
note ノート
tab タブ
folder フォルダー
box3d 3Dの箱形
rarrow 右向きの矢印
larrow 左向きの矢印

polygon

ポリゴンは他の形状とは少し設定する属性が増えます。

  • sides : 辺の数を指定します。デフォルトは4です。
  • skew : 正数は上部が右方向へゆがみます。負数は左方向へ歪みます。
  • distortion : 正数は上部の辺の長さが下部よりも大きくなるようにします。負数は逆の結果になります。

Node Shape Sample

サンプル1

dot_file
digraph shape_sample01 {
  graph [
    charset = "UTF-8";
    labelloc = "t",
    labeljust = "c",
    bgcolor = "#343434",
    fontcolor = white,
    fontsize = 18,
    style = "filled",
    rankdir = TB,
    margin = 0.2
  ];
  node [
    colorscheme = "rdylgn11"
    style = "solid,filled",
    fontsize = 18,
    fontcolor = 6,
    fontname = "Migu 1M",
    color = 7,
    fillcolor = 11
  ];

  // node define
  shape1 [label = "box", shape = box];
  shape2 [ label = "polygon", shape = polygon,
    sides = 8,
    skew = 0.0,
    distortion = 0.0
  ];
  shape3 [label = "ellipse", shape = ellipse];
  shape4 [label = "oval", shape = oval];
  shape5 [label = "circle",shape = circle];
  shape6 [label = "point", shape = point];
  shape7 [label = "egg", shape = egg];
}

shape01.png

サンプル2

dot_file
digraph shape_sample02 {
  graph [
    charset = "UTF-8";
    labelloc = "t",
    labeljust = "c",
    bgcolor = "#343434",
    fontcolor = white,
    fontsize = 18,
    style = "filled",
    rankdir = TB,
    margin = 0.2
  ];
  node [
    colorscheme = "rdylgn11"
    style = "solid,filled",
    fontsize = 18,
    fontcolor = 6,
    fontname = "Migu 1M",
    color = 7,
    fillcolor = 11
  ];

  // node define
  shape1 [label = "triangle", shape = triangle];
  shape2 [label = "plaintext", shape = plaintext];
  shape3 [label = "plain", shape = plain];
  shape4 [label = "diamond", shape = diamond];
  shape5 [label = "trapezium", shape = trapezium];
  shape6 [label = "parallelogram", shape = parallelogram];
  shape7 [label = "house", shape = house];
}

shape02.png

サンプル3

dot_file
digraph shape_sample03 {
  graph [
    charset = "UTF-8";
    labelloc = "t",
    labeljust = "c",
    bgcolor = "#343434",
    fontcolor = white,
    fontsize = 18,
    style = "filled",
    rankdir = TB,
    margin = 0.2
  ];
  node [
    colorscheme = "rdylgn11"
    style = "solid,filled",
    fontsize = 18,
    fontcolor = 6,
    fontname = "Migu 1M",
    color = 7,
    fillcolor = 11
  ];

  // node define
  shape1 [label = "pentagon", shape = pentagon];
  shape2 [label = "hexagon", shape = hexagon];
  shape3 [label = "septagon", shape = septagon];
  shape4 [label = "octagon", shape = octagon];
  shape5 [label = "doublecircle", shape = doublecircle];
  shape6 [label = "doubleoctagon", shape = doubleoctagon];
  shape7 [label = "tripleoctagon", shape = tripleoctagon];
}

shape03.png

サンプル4

dot_file
digraph shape_sample04 {
  graph [
    charset = "UTF-8";
    labelloc = "t",
    labeljust = "c",
    bgcolor = "#343434",
    fontcolor = white,
    fontsize = 18,
    style = "filled",
    rankdir = TB,
    margin = 0.2
  ];
  node [
    colorscheme = "rdylgn11"
    style = "solid,filled",
    fontsize = 18,
    fontcolor = 6,
    fontname = "Migu 1M",
    color = 7,
    fillcolor = 11
  ];

  // node define
  shape1 [label = "invtriangle", shape = invtriangle];
  shape2 [label = "invtrapezium", shape = invtrapezium];
  shape3 [label = "invhouse", shape = invhouse];
  shape4 [label = "Mdiamond", shape = Mdiamond];
  shape5 [label = "Msquare", shape = Msquare];
  shape6 [label = "Mcircle", shape = Mcircle];
  shape7 [label = "square", shape = square];
}

shape04.png

サンプル5

dot_file
digraph shape_sample05 {
  graph [
    charset = "UTF-8";
    labelloc = "t",
    labeljust = "c",
    bgcolor = "#343434",
    fontcolor = white,
    fontsize = 18,
    style = "filled",
    rankdir = TB,
    margin = 0.2
  ];
  node [
    colorscheme = "rdylgn11"
    style = "solid,filled",
    fontsize = 18,
    fontcolor = 6,
    fontname = "Migu 1M",
    color = 7,
    fillcolor = 11
  ];

  // node define
  shape1 [label = "star", shape = star];
  shape2 [label = "underline", shape = underline];
  shape3 [label = "note", shape = note];
  shape4 [label = "tab", shape = tab];
  shape5 [label = "folder", shape = folder];
  shape6 [label = "box3d", shape = box3d];
  shape7 [label = "rarrow", shape = rarrow];
  shape8 [label = "larrow", shape = larrow];
}

shape05.png

Node Sytle

sytle属性でノードのスタイルを設定します。
下記はノードのスタイル(枠線、塗つぶし方法)の種類です。

name desc
solid 枠を実線で引く
dashed 枠を破線で引く
dotted 枠を点線で引く
bold 枠を太線で引く
rounded 枠を角丸で引く
diagonals
filled ノードを単色で塗つぶし
striped ノードを複数色で縦縞状に塗つぶし
wedged ノードを複数色で楔状に塗つぶし

striped
The style "striped" is only supported with clusters and rectangularly-shaped nodes.

  • box
  • Msquare
  • rect
  • rectangle
  • square

wedged
The style "wedged" is allowed only for elliptically-shaped nodes.

  • ellipse
  • oval
  • circle
  • doublecircle
  • Mcircle

サンプル

dot_file
digraph node_sample {
  //graph settings
  graph [
    charset = "UTF-8";
    label = "node simple",
    labelloc = "t",
    labeljust = "c",
    bgcolor = "#343434",
    fontcolor = white,
    fontsize = 18,
    style = "filled",
    rankdir = TB,
    margin = 0.2
  ];
  // node common settings
  node [
    colorscheme = rdylgn11,
    fontname = "Migu 1M",
    color = 7,
    fontsize = 18,
    fontcolor = 6,
    fillcolor = 11,
    margin = 0.2
  ];

  // node define
  alpha [shape = box, label = "alpha", style = "solid,filled"];
  beta [shape = box, label = "beta", style = "dashed,filled"];
  gamma [shape = box, label = "gamma", style = "dotted,filled"];
  delta [shape = box, label = "delta", style = "bold,filled"];
  epsilon [shape = box, label = "epsilon", style = "rounded,filled"];
  zeta [shape = box, label = "zeta", style = "diagonals,filled"];
  eta [shape = box, label = "eta", style = "solid,striped" fillcolor = "8:9:10:11"];
  theta [shape = ellipse, label = "theta", style = "solid,wedged", fillcolor = "8:9:10:11"];
}

node_sample.png

レコード

ノードにはrecordという他の図形とは少し扱い方が異なる図形があります。
ラベルを|で区切るとノードをセルに分割することができます。
またラベルを{ }で囲むとセルの描画方向が横から縦に変わり、{ }をネストさせる度にセルの描画方向が横→縦→横のように変わります。

dot_file
digraph graph_name {
  graph [
    charset = "UTF-8",
    bgcolor = "#EDEDED",
    rankdir = TB,
    nodesep = 1.1,
    ranksep = 1.05
  ];

  node [
    shape = record,
    fontname = "Migu 1M",
    fontsize = 12,
  ];

  // node define
  alpha [label = "<pl>left|center|<pr>right"];
  beta [label = "<pl>left|<pc>center|<pr>right"];
  gamma [label = "left|center|<pr>right"];
  delta [label = "{left|{<pc>center|{top|middle|bottom}}|right}}"];
  epsilon [label = "{top|<pm>middle|bottom}"];

  // edge define
  alpha:pl -> beta:pl [ label = "a-b", weight = 2.0];
  alpha:pr -> gamma:pr [label = "a-g", weight = 1.0];
  beta:pc -> epsilon:pm [label = "b-e"];
  gamma -> delta:pc [label = "g-d"];
}

record_node.png

エッジをどのラベルから出すかポート名を指定して決めることができます。
ポート名はラベル中に<ポート名>のように記述します。

example
label = "left|center|<pr>right"

エッジを定義する際にノード名の後に:で区切ってポート名を指定します。

example
ノード名:ポート名 -> ノード名:ポート名 [
  ...
];

ノードのランク

rank

rank属性でノードのランクを設定します。
最小ランクが一番上または一番左に配置され、最大ランクが一番下または一番右に配置されます。

  • same : ノードを同じランクに配置します。
  • min : ノードを最小ランクに配置します。
  • source : (通常は)ノードを最小ランクに配置します。
  • max : ノードを最大ランクに配置します。
  • sink : maxと同じようにノードを一番下または一番左に配置します。

この例では下記のようにランク付けを行っています。

  • GroupAノードとalpha, delta, etaノードが同じランクになる
  • GroupBノードとbeta, epsilon, thetaノードが同じランクになる
  • GroupCノードとgamma, zetaノードが同じランクになる
dot_file
digraph graph_name {
  graph [
    charset = "UTF-8";
    label = "node simple",
    labelloc = "t",
    labeljust = "c",
    bgcolor = "#4D4D4D",
    fontcolor = white,
    fontsize = 18,
    style = "filled",
    rankdir = LR,
    margin = 0.1,
    nodesep = 0.5,
    ranksep = 0.7
  ];
  node [
    shape = ellipse,
    style = "filled",
    colorscheme = rdylgn11,
    fontname = "Migu 1M",
    color = 7,
    fontsize = 18,
    fontcolor = 6,
    fillcolor = 11,
    margin = 0.07
  ];
  edge [
    colorscheme = rdylgn11,
    color = 7
  ]

  alpha, beta, gamma, delta, epsilon, zeta, eta, theta;

  GroupA, GroupB, GroupC [shape = none, style = "", fontsize = 16];

  GroupA -> GroupB -> GroupC [arrowhead = none, color = white];

  {rank = same; GroupA; alpha; delta; eta;}
  {rank = same; GroupB; beta; epsilon; theta;}
  {rank = same; GroupC; gamma; zeta;}

}

node_rank_def1.png

任意のノードを最小ランクや最大ランクにまとめるには下記のように記述します。
グラフは左側から右側へ描画する設定(rankdir = LR)になっているので、最小ランクのノードは左側、最大ランクのノードは右側に配置されます。

example
digraph graph_name {
  graph [
    charset = "UTF-8";
    label = "node simple",
    labelloc = "t",
    labeljust = "c",
    bgcolor = "#4D4D4D",
    fontcolor = white,
    fontsize = 18,
    style = "filled",
    rankdir = LR,
    margin = 0.1,
    nodesep = 0.5,
    ranksep = 0.7
  ];
  node [
    shape = ellipse,
    style = "filled",
    colorscheme = rdylgn11,
    fontname = "Migu 1M",
    color = 7,
    fontsize = 18,
    fontcolor = 6,
    fillcolor = 11,
    margin = 0.07
  ];
  edge [
    colorscheme = rdylgn11,
    color = 7
  ]

  theta, eta, zeta, epsilon, delta, gamma, beta, alpha;

  alpha -> beta -> gamma [arrowhead = none,  color = white];

  {rank = min; alpha; delta; eta;}
  {rank = same; beta; epsilon; theta;}
  {rank = max; gamma; zeta;}

}

node_rank_def2.png

サンプル

rankを使って年表を表現したサンプルです。

dot_file
digraph graph_name {
  graph [
    charset = "UTF-8",
    bgcolor = "#4A4A4A",
    rankdir = LR,
    margin = 0.2
  ];
  node [
    shape = box,
    fontname = "Migu 1M",
    fontsize = 12,
    style = "solid, filled",
    fillcolor = "#EFEFEF"
  ];

   b1 [label = "第一次川中島の戦い\n1553年"];
   b2 [label = "第二次川中島の戦い\n1555年"];
   b3 [label = "厳島の戦い\n1555年"];
   b4 [label = "第三次川中島の戦い\n1557年"];

   b5 [label = "桶狭間の戦い\n1560年"];
   b6 [label = "第四次川中島の戦い\n1561年"];
   b7 [label = "三河一向一揆\n1563年"];
   b8 [label = "第五次川中島の戦い\n1564年"];

   b9 [label = "金ヶ崎の戦い\n1570年"];
   b10 [label = "姉川の戦い\n1570年"];
   b14 [label = "三方ヶ原の戦い\n1572年"];
   b15 [label = "一乗谷の戦い\n1573年"];
   b16 [label = "小谷城の戦い\n1573年"];
   b17 [label = "長篠の戦い\n1573年"];
   b18 [label = "七尾城の戦い\n1576年"];

   b20 [label = "天正伊賀の乱\n1581年"];
   b21 [label = "甲州征伐\n1582年"];
   b22 [label = "本能寺の変\n1582年"];
   b23 [label = "山崎の戦い\n1582年"];
   b24 [label = "賤ヶ岳の戦い\n1583年"];
   b25 [label = "小牧・長久手の戦い\n1584年"];
   b27 [label = "羽柴秀吉の紀州攻め\n1585年"];
   b28 [label = "羽柴勢の四国攻め\n1585年"];
   b29 [label = "九州平定\n1587年"];

   b30 [label = "小田原征伐\n1590年"];
   b31 [label = "文禄の役\n1592年"];
   b32 [label = "慶長の役\n1597年"];

   b33 [label = "関ヶ原の役\n1600年"];

   b1 -> b2 -> b4 -> b6 -> b8 [color = "#9A9A9A"];
   b9 -> b10 -> b15 -> b16 [color = "#DBDBDB"];
   b14 -> b17 -> b21;
   b22 -> b23;
   b24 -> b25 ->  b27 -> b28 -> b29 -> b30;
   b31 -> b32;

  1550, 1560, 1570, 1580, 1590, 1600;
  1550 -> 1560 -> 1570 -> 1580 -> 1590 -> 1600 [arrowhead = normal,  color = white];

   {rank = same; 1550; b1; b2; b3; b4;}
   {rank = same; 1560; b5; b6; b7; b8;}
   {rank = same; 1570; b9; b10; b14; b15; b16; b17; b18;}
   {rank = same; 1580; b20; b21; b22; b23; b24; b25; b27; b28; b29;}
   {rank = same; 1590; b30; b31; b32;}
   {rank = same; 1600; b33;}
}

nenpyo.png

サブグラフの定義

サブグラフの定義は下記のようにsubgraphというキーワードの後にclusterという文字からはじまる名前を付けます。(clusterという名前を付けるとクラスターサブグラフとして扱われます。)
属性はグラフと同様に[ ]内に属性と値を記述することで行います。

example
digraph graph_name {
  // define subgraph
  subgraph cluster_sub1 [
    属性 = 値;
    属性 = 値;
    ...
  ];
}

サンプル

digraph node_sample {
  //graph settings
  graph [
    charset = "UTF-8";
    label = "node simple",
    labelloc = "t",
    labeljust = "c",
    bgcolor = "#343434",
    fontcolor = white,
    fontsize = 18,
    style = "filled",
    rankdir = TB,
    margin = 0.2,
    nodesep = 0.5,
    ranksep = 0.8,
    compound = true
  ];
  // node common settings
  node [
    colorscheme = rdylgn11,
    fontname = "Migu 1M",
    color = 7,
    fontsize = 12,
    fontcolor = 6,
    fillcolor = 11,
    margin = 0.05,
    style = "solid,filled"
  ];
  edge [
    color = white
  ];

  subgraph cluster_0 {
    label = "clu0";
    labelloc = "t";
    labeljust = "l";
    fillcolor = "#ababab";

    alpha [label = "alpha", shape = box];
    beta [label = "beta", shape = box];
    gamma [label = "gamma", shape = box];
    eta [label = "eta", shape = box];

    alpha -> beta;
    alpha -> gamma;
    alpha -> eta;
  };

  subgraph cluster_1 {
    label = "clu1";
    labelloc = "t";
    labeljust = "l";
    fillcolor = "#ababab";

    delta [label = "delta"];
    epsilon [label = "epsilon"];
    zeta [label = "zeta"];
    theta [label = "theta"];

    delta -> epsilon;
    delta -> zeta;
    delta -> theta;
  };

  subgraph cluster_2 {
    label = "clu2";
    labelloc = "t";
    labeljust = "l";
    fillcolor = "#888888";

    lambda [label = "lambda", shape = "octagon"];
    mu [label = "mu", shape = "octagon"];

    lambda -> mu;
  };

 subgraph cluster_3 {
    label = "clu3";
    labelloc = "t";
    labeljust = "l";
    fillcolor = "#888888";

    nu [label = "nu", shape = "trapezium"];
    xi [label = "xi", shape = "trapezium"];

    nu -> xi;
  }

  subgraph sg {
    iota [label = "iota", shape = "Mdiamond" ];
    kappa [label = "kappa", shape = "Mdiamond"];
    iota -> kappa;
  };

  alpha -> delta;
  beta -> lambda [weight = 3];
  gamma -> lambda;
  epsilon -> nu;
  eta -> mu;
}

subgraph_def.png

compound

compound属性は2つのクラスターサブグラフ間にまたがるノードのエッジの始端、終端の位置をクラスターサブグラフの外縁に設定できるようにします。
エッジの両端をどのクラスターサブグラフにクリップするかはlhead属性とltail属性で指定します。

example
graph [
  compound = true
];

alpha -> delta [lhead = "cluster_1", ltail = "cluster_0"];

subgraph_def2.png

edge

edge Sytle

style属性でエッジのスタイルを設定できます。
下記はエッジのスタイルの種類です。

name desc
solid エッジを実線で引く
dashed エッジを破線で引く
dotted エッジを点線で引く
bold エッジを太線で引く

サンプル

dot_file
digraph edge_sample {
  //graph settings
  graph [
    charset = "UTF-8";
    label = "edge simple",
    labelloc = "t",
    labeljust = "c",
    bgcolor = "#343434",
    fontcolor = white,
    fontsize = 18,
    style = "filled",
    rankdir = TB,
    margin = 0.2
  ];
  // node common settings
  node [
    colorscheme = rdylgn11,
    fontname = "Migu 1M",
    color = 7,
    fontsize = 16,
    fontcolor = 6,
    fillcolor = 11,
    mirgin = 0.1
  ];
  // edge common settings
  edge [
    color = white,
    fontcolor = white
  ];

  // node define
  alpha [shape = box, label = "alpha", style = "solid,filled"];
  beta [shape = box, label = "beta", style = "dashed,filled"];
  gamma [shape = box, label = "gamma", style = "dotted,filled"];
  delta [shape = box, label = "delta", style = "bold,filled"];
  epsilon [shape = box, label = "epsilon", style = "rounded,filled"];
  zeta [shape = box, label = "zeta", style = "diagonals,filled"];
  eta [shape = box, label = "eta", style = "solid,striped", fillcolor = "8:9:10:11"];
  theta [shape = ellipse, label = "theta", style = "solid,wedged", fillcolor = "8:9:10:11"];

  // edge define
  alpha -> beta [style = "solid", label = "solid"];
  gamma -> delta [style = "dashed", label = "dashed"];
  epsilon -> zeta [style = "dotted", label = "dotted"];
  eta -> theta [style = "bold", label = "bold"];
}

edge_sample.png

arrows

エッジの先端の形状を設定することができます。
下記は形状の設定に使う属性です。

  • dir : エッジの矢印の表示タイプを指定します。
  • arrowhead : エッジの終端の矢印のタイプを指定します。
  • arrowtail : エッジの始端の矢印のタイプを指定します。
  • arrowsize : 矢印のサイズの大きさを指定します。

headとtail

NodeAからNodeBに向かってエッジが出ている例でいうと、エッジのNodeA側はtail(始端)であり、NodeB側はhead(終端)となります。

                --Forward-->
  +-----------+               +-----------+
  |  NodeA   (t)---[Edge]--->(h)   NodeB  |
  +-----------+               +-----------+
                <----back----

dirType

dirType属性でエッジの矢印の向きを設定することができます。
下記は設定できる値の種類です。

  • forward : エッジの終端に矢印を表示します。
  • back : エッジの始端に矢印を表示します。
  • both : エッジの両端に矢印を表示します。
  • none : 矢印を表示しません。

サンプル

dot_file
digraph edge_sample {
  //graph settings
  graph [
    charset = "UTF-8";
    label = "edge simple",
    labelloc = "t",
    labeljust = "c",
    bgcolor = "#343434",
    fontcolor = white,
    fontsize = 18,
    style = "filled",
    rankdir = TB,
    margin = 0.2,
    pad = 0.1
  ];
  // node common settings
  node [
    colorscheme = rdylgn11,
    fontname = "Migu 1M",
    color = 7,
    fontsize = 16,
    fontcolor = 6,
    fillcolor = 11,
    mirgin = 0.1
  ];
  // edge common settings
  edge [
    color = white,
    fontcolor = white
  ];

  // node define
  alpha [shape = box, label = "alpha", style = "solid,filled"];
  beta [shape = box, label = "beta", style = "dashed,filled"];
  gamma [shape = box, label = "gamma", style = "dotted,filled"];
  delta [shape = box, label = "delta", style = "bold,filled"];
  epsilon [shape = box, label = "epsilon", style = "rounded,filled"];
  zeta [shape = box, label = "zeta", style = "diagonals,filled"];
  eta [shape = box, label = "eta", style = "solid,striped", fillcolor = "8:9:10:11"];
  theta [shape = ellipse, label = "theta", style = "solid,wedged", fillcolor = "8:9:10:11"];

  // edge define
  alpha -> beta [style = "solid", label = " forward", dir = forward];
  gamma -> delta [style = "solid", label = " back", dir = back];
  epsilon -> zeta [style = "solid", label = " both", dir = both];
  eta -> theta [style = "solid", label = " none", dir = none];
}

arrow_type.png

Arrow Shapes

エッジの矢印の形状を設定することができます。
下記はエッジの矢印の種類です。

name family
box lbox,rbox,obox,olbox,orbox
crow lcrow,rcrow
curve lcurve,rcurve
diamond ldiamond,rdiamond,odiamond,oldiamond,ordiamond
dot odot
inv linv,rinv,oinv,olinv,orinv
none
normal (default) lnormal,rnormal,onormal,olnormal,ornormal
tee ltee,rtee
vee lvee,rvee

prefix

  • l : エッジの左側の部分のみを残して形状をクリップ。
  • r : エッジの右側の部分のみを残して形状をクリップ。
  • o : 矢印を塗つぶさないバージョンを使用します。

サンプル1

dot_file
// edge define
alpha -> beta [style = "solid", label = " box", arrowhead = box];
gamma -> delta [style = "solid", label = " crow", arrowhead = crow];
epsilon -> zeta [style = "solid", label = " curve", arrowhead = curve];
eta -> theta [style = "solid", label = " diamond", arrowhead = diamond];

arrow_01.png

サンプル2

dot_file
// edge define
alpha -> beta [style = "solid", label = " dot", arrowhead = dot];
gamma -> delta [style = "solid", label = " inv", arrowhead = inv];
epsilon -> zeta [style = "solid", label = " tee", arrowhead = tee];
eta -> theta [style = "solid", label = " vee", arrowhead = vee];

arrow_02.png

接続ポート

headport、tailport属性でエッジの始端と終端の位置を指定することができます。
指定できる値は下記の通りです。

value position
n 上 (北)
ne 右上 (北東)
e 右 (東)
se 右下 (南東)
s 下 (南)
sw 左下 (南西)
w 左 (西)
nw 左上 (北西)
c 中央
_ 自動 (default)

下記は正方形のノードを例にしたポートの位置です。

port
  +---+---+---+
  |nw | n | ne|
  +---+---+---+
  | w |   | e |
  +---+---+---+
  |sw | s | se|
  +---+---+---+

サンプル

dot_file
digraph graph_name {
  graph [
    charset = "UTF-8",
    bgcolor = "#EDEDED",
    rankdir = TB,
    nodesep = 0.8,
    ranksep = 1.1
  ];

  node [
    shape = rect,
    fontname = "Migu 1M",
    fontsize = 12
  ];

  alpha [label = "alpha"];
  beta [label = "beta"];
  gamma [label = "gamma"];
  delta [label = "delta"];

  {rank = min; alpha;}
  {rank = same; beta; gamma;}
  {rank = max; delta;}

  alpha -> beta [tailport = w, headport = nw];
  alpha -> gamma [tailport = e, headport = ne];
  beta -> delta [tailport = sw, headport = w];
  gamma -> delta [tailport = se, headport = e];
}

port_pos.png

command line tool

dot.exe

dot.exeはdotファイルを読み込んで指定したフォーマットの画像ファイルへ出力するCUIのツールです。

> dot.exe -Kdot -Tpng graph_sample.dot -ograph_sample.png
  • -Kv : vにはレイアウトエンジンを指定します。
  • -Tv : vには出力フォーマットを指定します。
  • -ofile : fileには出力ファイル名を指定します。

引数

引数にグラフの属性名と値を指定して実行するとその属性を上書きして画像ファイルを生成することができます。

  • -Gname : nameにグラフの属性名を指定します。
  • -Nname : nameにノードの属性名を指定します。
  • -Ename : nameにエッジの属性名を指定します。

下記はグラフのラベルを引数で指定する例です。-Glabelでグラフのlabel属性の値を上書きします。

> dot.exe -v -Glabel="new title" -Kdot -Tpng graph_sample.dot -ograph_sample.png

Usage

Usage
D:\dev\graphviz-2.38\bin>dot.exe -?
Usage: dot [-Vv?] [-(GNE)name=val] [-(KTlso)<val>] <dot files>
(additional options for neato)    [-x] [-n<v>]
(additional options for fdp)      [-L(gO)] [-L(nUCT)<val>]
(additional options for memtest)  [-m<v>]
(additional options for config)  [-cv]

 -V          - Print version and exit
 -v          - Enable verbose mode
 -Gname=val  - Set graph attribute 'name' to 'val'
 -Nname=val  - Set node attribute 'name' to 'val'
 -Ename=val  - Set edge attribute 'name' to 'val'
 -Tv         - Set output format to 'v'
 -Kv         - Set layout engine to 'v' (overrides default based on command name)
 -lv         - Use external library 'v'
 -ofile      - Write output to 'file'
 -O          - Automatically generate an output filename based on the input filename with a .'format' appended. (Causes all -ofile options to be ignored.)
 -P          - Internally generate a graph of the current plugins.
 -q[l]       - Set level of message suppression (=1)
 -s[v]       - Scale input by 'v' (=72)
 -y          - Invert y coordinate in output

 -n[v]       - No layout mode 'v' (=1)
 -x          - Reduce graph

 -Lg         - Don't use grid
 -LO         - Use old attractive force
 -Ln<i>      - Set number of iterations to i
 -LU<i>      - Set unscaled factor to i
 -LC<v>      - Set overlap expansion factor to v
 -LT[*]<v>   - Set temperature (temperature factor) to v

 -m          - Memory test (Observe no growth with top. Kill when done.)
 -m[v]       - Memory test - v iterations.

 -c          - Configure plugins (Writes $prefix/lib/graphviz/config
               with available plugin information.  Needs write privilege.)
 -?          - Print usage and exit

gvedit.exe

gveditはdotファイルの作成、編集およびグラフのプレビューを行うことができるGUIのツールです。

gvedit_ss.png

Attributes

属性の適用箇所

E,N,G,S,Cの意味は下記の通りです。

  • E: edges
  • N: nodes
  • G: the root graph
  • S: subgraphs
  • C: cluster subgraphs
name E N G S C type default notes
arrowhead E arrowType normal エッジの終端の形状を指定
arrowsize E double 1.0 矢印の大きさ倍率で指定
arrowtail E arrowType normal エッジの始端の形状を指定
bgcolor G C color,colorList 背景色
center G bool false 中央に出力する
charset G string "UTF-8" キャラクタセットを指定
color E N C color,colorList black 図形のカラー
colorscheme E N G C string "" 図形のカラースキーマの名前空間を指定, colorやfillcolorはスキーマの色番号で指定できる
comment E N G string "" コメント
compound G bool false クラスタ間のエッジを可能とする
concentrate G bool false 同一ノードへのエッジの線を1つに束ねる
dir E dirType forward(directed),none(undirected) エッジの矢印のタイプを指定する
constraint E bool true ランク付けにエッジを考慮する
distortion N double 0.0 shape=polygon
fillcolor E N C color,colorList lightgrey(N),black(C) 塗つぶし色
fixedsize N bool,string false ノードの大きさを指定可能にする 実際の大きさはheight/width
fontcolor E N G C color black フォントカラー
fontname E N G C string "Times-Roman" フォント名
fontpath G string system-dependent フォントを探すパス
fontsize E N G C double 14.0 フォントサイズ
forcelabels G bool true
gradientangle N G C int "" グラデーション塗りの角度
group N string "" グループ名 同じグループのノードをより近く配置する
headlabel E lblString "" エッジの終端のラベル
headport E portPos center エッジの終端を接続するポート
height N double 0.5 ノードの高さ
label E N G C lblString "\N" (nodes),"" (otherwise) ラベル
labelangle E double -25.0 ラベルの位置を角度で指定する
labeldistance E double 1.0 ラベルの位置をノードからの距離で指定する
labelfloat E bool false ラベルの重なりを許可する
labelfontcolor E color black ラベルのフォントカラー
labelfontname E string "Times-Roman" ラベルのフォント名
labelfontsize E double 14.0 ラベルのフォントサイズ
labeljust G C string "c" ラベル位置 r=right-justified, l=left-justified
labelloc N G C string "t"(C),"b"(G),"c"(N) ラベル位置 t=top, b=bottom, c=centered
landscape G bool false
layer E N C layerRange ""
layerlistsep G string ","
layers G layerList ""
layerselect G layerRange ""
layersep G string " :\t"
layout G string "" グラフのレイアウトを指定します。デフォルトはdotです。
lhead E string "" エッジの終端をクリップするクラスターの名前
lheight G C double ラベルの高さ. (write only)
lp E G C point
ltail E string "" エッジの始端をクリップするクラスターの名前
lwidth G C double ラベルの幅. (write only)
margin N G C double,point ノードの場合はラベルのマージン、labelloc,fixedsizeが指定されている場合は無効
nodesep G double 0.25 ノード間の距離
nojustify E N G C bool false
pad G double,point 0.0555 (4 points) パディングを指定
peripheries N C int shape default(N),1(C) 枠線の重数
ordering N G string ""
orientation N double 0.0
orientation G string ""
rank S rankType ランクの指定 "same", "min", "source", "max", "sink"
rankdir G rankdir TB 配置方向 TB, BT, LR, RL
ranksep G double,doubleList 0.5(dot),1.0(twopi) 同一ランクのノード間の距離
ratio G double,string
regular N bool false
rotate G int 0 グラフの回転度
shape N shape ellipse ノードの形状
sides N int 4 shape=polygonの時.頂点の数を指定
size G double,point グラフの最大サイズ
skew N double 0.0 shape=polygon
splines G bool,string エッジの描画方法を指定する none,line(false),polyline,curved,ortho,spline(true)
style E N G C style "" 枠線のスタイル filled=塗つぶす
taillabel E lblString "" エッジの始端のラベル
tailport E portPos center エッジの始端を接続するポート
weight E int,double 1 エッジの重み付け 重みが大きいエッジが結ぶノードがより近く配置される
width N double 0.75 ノードの幅

colorList

typeがcolorListの属性は下記のように複数の色を指定できます。

example
color = "white:red:yellow"
example
color = "#EFEFEF:#F0F0F0:#ADADAD"

rankdir

  • TB : top to bottom.
  • BT : bottom to top.
  • LR : left to right.
  • RL : right to left.

メモ

layout

レイアウトエンジンについて

circo

circo draws graphs using a circular layout (see Six and Tollis, GD ’99 and ALENEX ’99, and Kaufmann
and Wiese, GD ’02.) The tool identifies biconnected components and draws the nodes of the component on
a circle.

fdp

fdp draws undirected graphs using a ‘spring’ model. It relies on a force-directed approach in the spirit of
Fruchterman and Reingold (cf. Software-Practice & Experience 21(11), 1991, pp. 1129-1164).

neato

neato draws undirected graphs using a ‘spring’ model and reducing the related energy (see Kamada and
Kawai, Information Processing Letters 31:1, April 1989).

osage

osage draws the graph using its cluster structure. For a given cluster, each of its subclusters is laid out internally

sfdp

sfdp also draws undirected graphs using the ‘spring’ model described above, but it uses a multi-scale
approach to produce layouts of large graphs in a reasonably short time

twopi

twopi draws graphs using a radial layout (see G. Wills, Symposium on Graph Drawing GD’97, September,
1997). Basically, one node is chosen as the center and put at the origin.

http://www.graphviz.org/pdf/dot.1.pdf