概要
DOT言語で記述したコードからグラフを生成できます。
グラフではなくコードを編集して生成する形をとることにより、
修正作業が容易になったり、差分が明確になったりといった恩恵を受けることができます。
以下、Macでの導入を記述していきます。
導入
Homebrew
経由で入ります。
brew install graphviz
HelloWorld
dotファイルを作成します。
digraph "hello world" {
Hoge -> Huga;
}
graphviz
の導入により、 dot
コマンドが使用できるようになります。
このコマンドにより、作成したdotファイルから画像を生成します。
以下の例では png
を指定しています。
サポートするフォーマットの一覧はドキュメントから確認できます。
dot -T png hello.dot -o hello.png
生成された画像を確認します。
open hello.png
逆引き
形状の変更
shape
を指定することで変更可能です。
形状の一覧はドキュメントから確認できます。
digraph "hello world" {
node [shape = box];
Hoge -> Huga;
Foo -> Huga;
Bar -> Huga;
Bar [shape = box3d];
}
矢印の変更
arrowhead
、arrowtail
を指定することで変更可能です。
形状の一覧はドキュメントから確認できます。
digraph "hello world" {
Hoge -> Huga;
Foo -> Huga [arrowhead = vee];
Bar01 -> Huga [dir = both];
Bar02 -> Huga [dir = both, arrowhead = crow, arrowtail = dot];
}
色の変更
color
、fontcolor
を指定することで変更可能です。
色の一覧はドキュメントから確認できます。
digraph "hello world" {
Hoge -> Huga;
Foo -> Huga;
Bar -> Huga [color = red];
Foo [color = green];
Huga [style = filled, color = blue, fontcolor = white];
}
グループ分け
subgraph
を指定することでグループ分けが可能です。
prefix として cluster
を付与する必要があります。
digraph "hello world" {
{Hoge, Foo, Bar} -> Huga;
Huga -> {Piyo01, Piyo02, Piyo03};
subgraph cluster01 {
{Hoge, Foo, Bar};
style = filled;
label = "hogehoge";
}
subgraph cluster02 {
Huga;
label = "hugahuga";
}
subgraph cluster_piyo {
{Piyo01, Piyo02, Piyo03};
}
}
横方向に展開
rank_dir
に LR
を指定することで横方向に構造が進む形になります。
digraph "hello world" {
rank_dir = LR;
{Hoge, Foo, Bar} -> Huga;
Huga -> {Piyo01, Piyo02, Piyo03};
subgraph cluster01 {
{Hoge, Foo, Bar};
style = filled;
label = "hogehoge";
}
subgraph cluster02 {
Huga;
label = "hugahuga";
}
subgraph cluster_piyo {
{Piyo01, Piyo02, Piyo03};
}
}
グループに対して矢印
compound = true
、lhead
、ltail
を指定します。
digraph "hello world" {
compound = true;
{Hoge, Foo, Bar} -> Huga [lhead = cluster02];
Huga -> {Piyo01, Piyo02, Piyo03} [lhead = cluster_piyo, ltail = cluster02];
subgraph cluster01 {
{Hoge, Foo, Bar};
style = filled;
label = "hogehoge";
}
subgraph cluster02 {
Huga;
label = "hugahuga";
}
subgraph cluster_piyo {
{Piyo01, Piyo02, Piyo03};
}
}
作成例
サーバー構成図のサンプルを作ってみました。
digraph "server" {
compound = true;
Internet -> FrontLoadBalancer;
FrontLoadBalancer -> Front01 [lhead = cluster_front];
Front01 -> DB_Master [lhead = cluster_db_master, ltail = cluster_front];
Front01 -> DBLoadBalancer [lhead = cluster_db_slave, ltail = cluster_front];
DBLoadBalancer -> {DB_Slave01, DB_Slave02, DB_Slave03};
subgraph "cluster_front" {
label = "Front Servers";
{Front01, Front02, Front03};
}
subgraph "cluster_db" {
subgraph "cluster_db_master" {
label = "DB Master";
DB_Master;
}
subgraph "cluster_db_slave" {
label = "DB Slave";
DBLoadBalancer;
{DB_Slave01, DB_Slave02, DB_Slave03};
}
}
}
他にも、オフィシャルサイトにGalleryがあり、
グラフとコードのサンプルが載っていますので、
作りたい図に近いものを探して参考にすると作成しやすくなります。