« 寒暖計を見たら29℃だった。 | トップページ | ふと気がついたorz(その2) »

2009/04/10

Graphvizのレイアウトについて

Graphvizの各種レイアウトの特徴を一言でまとめると、以下のようになります。

  • dot……階層状配置
  • neato……等間隔配置
  • twopi……放射状配置
  • circo…環状配置

以下にそれぞれで同じソースを処理して、結果を比較してみました。

今回使用したソースその1は次のようなものです。単純に各ノードから同じ数の子ノードを配置しています。

digraph layouttest {
n00 -> {n01; n02; n03};
n01 -> {n04; n05; n06};
n02 -> {n07; n08; n09};
n03 -> {n10; n11; n12};
n04 -> {n13; n14; n15};
n05 -> {n16; n17; n18};
n06 -> {n19; n20; n21};
n07 -> {n22; n23; n24};
n08 -> {n25; n26; n27};
n09 -> {n28; n29; n30};
n10 -> {n31; n32; n33};
n11 -> {n34; n35; n36};
n12 -> {n37; n38; n39};
}

なお、その1を処理した画像はそれぞれ3分の1に縮小してあります。

ソースその2は次のようなものです。ノードを環状に連結して、さらにエッジを2本追加しました。

digraph layouttest {
n0 -> n1 -> n2 -> n3 -> n4 -> n5 -> n6 -> n7 -> n8 -> n9;
n9 -> n0;
n5 -> n1;
n2 -> n8;
}

dotの場合

Layouttest_dot

Layouttest_c_dot

連結の左側のノードと右側のノードの間に上下関係ができ、総合的に見て一番上位のものが一番上に配置されます。

トーナメント表のような階層構造を持ったものや、時系列に並んでいるものなどに適しています。

ノードは重ならないように配置されるので、その1のデータで子ノードの数を4つにしたら、横幅がとんでもなく長くなりました。

neatoの場合

Layouttest_neato

Layouttest_c_neato

各エッジがバネになって引き合っているかのように、ほぼ等距離になるように配置されます。

dotのような方向性はありません。

neatoの場合は、ノードが多くなると重なる様に配置されることもあります。何も設定しなければ、密度に応じて重ならないように、勝手に調整してはくれません。その1で子ノードが4つのときは全体的なグラフの大きさはあまり変わらず、ノードが束ねられているかのように重なってました。

twopiの場合

Layouttest_twopi

Layouttest_c_twopi

中心のノードから同心円状にノードが配置されます。

  • neato……エッジに沿った距離が等間隔
  • twopi……中心のノードからの直線距離が等間隔

という感じでしょうか。

twopiも、何も設定しなければ、ノードの密度に応じて重ならないように勝手に自動調整はしてくれません。

circoの場合

Layouttest_circo

Layouttest_c_circo

複数の環状構造を持ったもの向きのレイアウトだそうです。

その1では、neatoとの違いがエッジの長さ以外によく分かりませんが、その2ではノードがきれいに円周上に並んでいます。

neatoやtwopiで、ノードがもっと沢山あるときに重ならないようにする方法も当然あります。方法が何種類かあるので、これはまた別の機会に。

|

« 寒暖計を見たら29℃だった。 | トップページ | ふと気がついたorz(その2) »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: Graphvizのレイアウトについて:

« 寒暖計を見たら29℃だった。 | トップページ | ふと気がついたorz(その2) »