03

08

Graphviz サンプル集 (使い方)

2013.03.08(19:45)

無向グラフ、有向グラフ作成ツール
Graphviz
http://www.graphviz.org/
のサンプル集です。

Graphvizをインストールして、
以下のようなテキストをいれたdotファイルを作り、
コマンドラインから、
dot -Tpng nagano.dot -o nagano.png
などと打てば、画像ファイルができあがります。

位置の微調整とかできませんが、てっとりばやく
説明図面が作りたいときには重宝します。

路線図やプロセスフローダイヤグラム、関数呼び出し関係図、データ構造の図などが簡単に描けます。
ただいま少しずつサンプルを増やしています。

木が2本の無向グラフ。辺にラベルがついている例。
日本語を使いたいときはUTF-8でdotファイルを作成し、
さらにフォント指定するとうまくいく。
jr_nagano.png
// comment
graph G {
  graph [charset="UTF-8"];
  matsumoto [label="松本", fontname="MS UI Gothic",fontsize=20];
  shiojiri [label="塩尻", fontname="MS UI Gothic"];
  okaya [label="岡谷", fontname="MS UI Gothic"];
  tatsuno [label="辰野", fontname="MS UI Gothic"];

  nagano [label="長野", fontname="MS UI Gothic"];
  karuizawa [label="軽井沢", fontname="MS UI Gothic"];
  takasaki [label="高崎", fontname="MS UI Gothic"];

  matsumoto -- shiojiri [ label = "13.3km", fontname="MS UI Gothic",fontsize=20 ];
  shiojiri -- tatsuno;
  okaya -- tatsuno;
  shiojiri -- okaya;

  nagano -- karuizawa;
  karuizawa -- takasaki;
}

根が左で葉が右に伸びるグラフ。頂点を囲む図形を四角形、楕円、円などから選択できる。

pfd.png
digraph G {
  rankdir=LR; // 左から右へ
  graph [charset="UTF-8"];

  node [shape=box]; // ここから下は四角形
  spec1 [label="仕様書1", fontname="MS UI Gothic"];
  spec2 [label="仕様書2", fontname="MS UI Gothic"];
  spec3 [label="仕様書3", fontname="MS UI Gothic"];
  product1 [label="成果物1", fontname="MS UI Gothic"];
  product2 [label="成果物2", fontname="MS UI Gothic"];

  node [shape=circle]; // ここから下は円

  node [shape=oval]; // ここから下は楕円
  process1 [label="プロセス1", fontname="MS UI Gothic"];
  process2 [label="プロセス2", fontname="MS UI Gothic"];

  spec1 -> process1;
  spec2 -> process1;
  process1 -> product1;

  product1 -> process2;
  spec3 -> process2;
  process2 -> product2;

  overlap=false
  label="プロセスフローダイヤグラム"
  fontsize=12;
  fontname="MS UI Gothic"
}


二分木で、根から葉に向かって少しずつ左に降りてゆくようなグラフを描きたいときは
以下のように色指定できるので、色がついているところを白にすると、
希望するグラフが描ける
avl_tree3.png
digraph G {
  1 -> 2; 
  1 -> 3 [color="blue"];
  3  [style=filled, fontcolor="green" color = "red", fillcolor="yellow"];
  2 -> 4;
  2 -> 5 [color="blue"];
  5  [style=filled, fontcolor="green" color = "red", fillcolor="yellow"];
}

複数の頂点を長方形で囲む
apache.png
digraph G {
  "modules" -> "include"
  "modules" -> "srclib"
  "server" -> "http"
  "server" -> "proxy"
  "server" -> "include"
  "include" -> "srclib"
  "server" -> "srclib"

  subgraph cluster_a {
    "modules"
    "http"
    "proxy"
  }

  overlap=false
  label="Apache HTTP Server 2.0.55"
  fontsize=12;
}

あまり美しくない二分木
構造体のメンバーから辺が延びている例
vertex.png
digraph structs { 
	rankdir = "TB"
	node [shape=record];
	struct1 [label="<f0>|<f1>1|<f2>"];
	struct2 [label="<f0>|<f1>2|<f2>"];
	struct3 [label="<f0>|<f1>3|<f2>"];
	struct4 [label="<f0>|<f1>4|<f2>"];
	struct5 [label="<f0>|<f1>5|<f2>"];

	struct1:f0 -> struct2:f1;
	struct1:f2 -> struct3:f1;
	struct2:f0 -> struct4:f1;
	struct2:f2 -> struct5:f1;
}

隣接リスト
一次元配列から延びるリンクリスト
構造体の例
vertex3.png
digraph structs { 
	//rankdir = "TB"
	rankdir = "LR"
	node [shape=record];
	struct01 [label="1"];
	struct02 [label="2"];

	struct11 [label="3"];

	struct21 [label="1"];
	struct22 [label="3"];

	struct0 [label="{<f0>state0} | {<f1>state1} | {<f2>state2} | {<f3>state3}"];

	struct01 -> struct02;
	struct21 -> struct22;

	struct0:f0 -> struct01;
	struct0:f1 -> struct11;
	struct0:f2 -> struct21;
}

関手
functor.png
ノードの高さを揃えることと、ノードを長方形で囲むことが同時にできないみたい。方法がないかただいま研究中。
// dot -Tpng functor.dot -o functor.png
digraph G {
  rankdir = "TB"
  "String" -> "Maybe String" [label = "Maybe"]
  "String" -> "[String]" [label = "[]"]

  "Int" -> "Maybe Int" [label = "Maybe"]
  "Int" -> "[Int]" [label = "[]"]

  "String" -> "Int" [label = "f"]
  "Maybe String" -> "Maybe Int"  [label = "fmap f"]
  "[String]" -> "[Int]" [label = "fmap f"]

  subgraph "cluster_a" {
    label = "普通の型圏"; fontname="MS UI Gothic"; "String"; "Int";
  }
  subgraph cluster_b { 
    label = "失敗するかも圏"; fontname="MS UI Gothic"; "Maybe String"; "Maybe Int";
  }

  subgraph cluster_c {
    label = "たくさんあるかも圏"; fontname="MS UI Gothic";     "[String]"; "[Int]";
  }
  label = "関手、Functor"; fontname="MS UI Gothic";
}

関手2
functor2.png
ノードの高さを揃えることと、ノードを長方形で囲むことが同時にできないみたい。方法がないかただいま研究中。
// dot -Tpng functor.dot -o functor.png
digraph G {
  rankdir = "TB"

  {
   rank = same; "[String]"; "String"; "Maybe String";
  }
  {
   rank = same; "[Int]"; "Int"; "Maybe Int";
  }

  "String" -> "Maybe String" [label = "Maybe"]
  "String" -> "[String]" [label = "[]"]

  "Int" -> "Maybe Int" [label = "Maybe"]
  "Int" -> "[Int]" [label = "[]"]

  "String" -> "Int" [label = "f"]
  "Maybe String" -> "Maybe Int"  [label = "fmap f"]
  "[String]" -> "[Int]" [label = "fmap f"]
  label = "関手、Functor"; fontname="MS UI Gothic";

}
プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示