GraphViz - Altgraflar nasıl bağlanır?


166

In DOTiçin dilin GraphViz, bir bağımlılık diyagramı temsil etmeye çalışıyorum. Bir kapsayıcı içinde düğümlere sahip olabilmem ve düğümleri ve / veya kapları diğer düğümlere ve / veya kaplara bağımlı hale getirebilmem gerekiyor.

Kaplarımı subgraphtemsil etmek için kullanıyorum . Düğüm bağlantısı gayet iyi çalışıyor, ancak altgrafları nasıl bağlayacağımı anlayamıyorum.

Aşağıdaki programı göz önüne alındığında, bağlanmak gerekiyor cluster_1ve cluster_2bir okla, ama denedim şey yerine kümelerin bağlayan yeni düğümler oluşturur:

digraph G {

    graph [fontsize=10 fontname="Verdana"];
    node [shape=record fontsize=10 fontname="Verdana"];

    subgraph cluster_0 {
        node [style=filled];
        "Item 1" "Item 2";
        label = "Container A";
        color=blue;
    }

    subgraph cluster_1 {
        node [style=filled];
        "Item 3" "Item 4";
        label = "Container B";
        color=blue;
    }

    subgraph cluster_2 {
        node [style=filled];
        "Item 5" "Item 6";
        label = "Container C";
        color=blue;
    }

    // Renders fine
    "Item 1" -> "Item 2";
    "Item 2" -> "Item 3";

    // Both of these create new nodes
    cluster_1 -> cluster_2;
    "Container A" -> "Container C";
}

resim açıklamasını buraya girin


2
Aynı problemi yaşıyorum, ancak alt çizimlerin düğüm gibi hareket ettikleri doğal bir örneği var, graphviz.org/content/fdpclust .
nlucaroni

1
@nlucaroni Bu sorunun çözülüp çözülmediğini merak ediyorum. bu örnek bana yanlış grafik veriyor: kenarlar altgrafın merkezlerini birleştiriyor. Örnekte olduğu gibi çalışmasını nasıl sağlayacağınızı bilmiyor musunuz?
k102

1
@ k102, biliyorum. Bu sayfaya tekrar göz atın; kullanmanız gerektiğini söylüyor fdp. Bağlantılı örnek ve her ikisinin de çalışması (buradaki örnekteki son satırın etiket değil alt bölüm adlarını kullanması gerekir ve grafik için satır uzunluklarını eklemek güzel olabilir); olduğu gibi biraz sıkı).
nlucaroni

1
@nlucaroni Çizgileri v2.28.0 kullanarak fdpve kaynağı kopyalayarak / yapıştırarak satırlar kenarlara değil alt bölümün merkezine bağlanır. .Dot dosyasını OmniGraffle içinde açarsanız, düzgün bağlanırlar neatove dother ikisi de küme için gereksiz düğümler oluşturur.
Phrogz

Yanıtlar:


190

DOT kullanım kılavuzu, kümeler arasında kenarları olan kümeleri olan bir grafik örneği verir:

ÖNEMLİ: İlk compound=trueifade gereklidir.

digraph G {
  compound=true;
  subgraph cluster0 {
    a -> b;
    a -> c;
    b -> d;
    c -> d;
  }
  subgraph cluster1 {
    e -> g;
    e -> f;
  }
  b -> f [lhead=cluster1];
  d -> e;
  c -> g [ltail=cluster0,lhead=cluster1];
  c -> e [ltail=cluster0];
  d -> h;
}

... ve düğümler ve kümeler arasındaki kenarlar:

resim açıklamasını buraya girin


14
Teşekkürler - işe yarıyor, ama gerçekten çirkin bir kesmek gibi geliyor. Ben ediyorum umuduyla hiçbir düğümlerle bir kap var nerede bir senaryo yok.
Winston Smith

5
Herhangi birinin ilgilenmesi durumunda, etiketli bağlantılarınız (kenarlar) varsa bu konumlandırma sorunlarına neden olabilir. Kenarın başı veya kuyruğu bir kümenin altına gizlenmiş olsa da, etiket hala orta noktada konumlandırılmıştır, yani bazı kenar etiketlerinin kenar tarafından konumlandırılmak yerine bir kümenin üzerinde yüzdüğü görülmektedir.
Winston Smith

58
@WinstonSmith: Eski bir soru, ancak benzer bir sorunum vardı ve küme başına görünmeyen bir kukla düğümle çözdüm, aksi halde küme boş olsa bile bağlantı kurulabilir. DUMMY_0 [shape=point style=invis]
DevSolar

2
Yalnızca dikey olarak bağlanan kümeleri kullanırken, kümeler arası kenarlarımın yalnızca ok başlarına daraltıldığını buldum. Bunu kenarlarda minlen = 1 ile sabitledim . c -> g [ltail = küme0, lhead = küme1, minlen = 1];
Freenerd

3
El kitabının örneğiyle bağlantısı: graphviz.org/Documentation/dotguide.pdf (sayfa 30).
Kirill Bulygin

90

Referans kolaylığı için, doğrudan orijinal soruya uygulanan HighPerformanceMark'ın cevabında açıklanan çözüm şöyle görünür:

digraph G {

    graph [fontsize=10 fontname="Verdana" compound=true];
    node [shape=record fontsize=10 fontname="Verdana"];

    subgraph cluster_0 {
        node [style=filled];
        "Item 1" "Item 2";
        label = "Container A";
        color=blue;
    }

    subgraph cluster_1 {
        node [style=filled];
        "Item 3" "Item 4";
        label = "Container B";
        color=blue;
    }

    subgraph cluster_2 {
        node [style=filled];
        "Item 5" "Item 6";
        label = "Container C";
        color=blue;
    }

    // Edges between nodes render fine
    "Item 1" -> "Item 2";
    "Item 2" -> "Item 3";

    // Edges that directly connect one cluster to another
    "Item 1" -> "Item 3" [ltail=cluster_0 lhead=cluster_1];
    "Item 1" -> "Item 5" [ltail=cluster_0 lhead=cluster_2];
}

compound=trueİçinde graphbildiriminde hayati önem taşımaktadır. Bu çıktı üretir:

bağlı kümeleri olan grafik

Kenarları kümedeki başvuru düğümlerine değiştirecek şekilde değiştirdim, her kenara ltail ve lhead özniteliklerini ekledim, küme adını belirttim ve 'bileşik = true' grafik düzeyi özniteliğini ekledim.

İçinde düğüm olmayan bir kümeyi bağlamak isteyebileceği endişesi ile ilgili olarak, çözümüm her zaman style = plaintext ile oluşturulan her kümeye bir düğüm eklemek olmuştur . Kümeyi etiketlemek için bu düğmeyi kullanın (boş dizeye ayarlanması gereken kümenin yerleşik "etiket" özniteliği yerine (Python'da label='""') Bu, artık kümeleri doğrudan bağlayan kenarlar eklemediğim anlamına gelir, ancak benim özel durumumda çalışıyor.


24
Not: 'graph [fontsize = 10 fontname = "Verdana" bileşik = true];' esastır - ltail / lhead'e bağlanma işe yaramazsa.
s.Daniel

1
@JonathanHartley, Son paragrafınıza göre, bu düğümü kümenin ortasında ortalamanın bir yolu var mı?
Pacerier

ayrıca kümenin adı büyük harfle
başlamamalıdır

7
@ s.Daniel Bu sadece bileşik = true; gerekli
Dr. Max Völkel

Bağlantı "Öğe 1" -> "Öğe 3" olduğunda lhead ve ltail'i sıfırlamak yerine cluster_0 ve cluster_1 öğelerini anlamlı kodla nasıl bağlarım? Meam, cluster_0 -> cluster_1çıktı olarak sun . Cluster_0 öğesinde cluster_1 içindeki diğer birçok öğeye bağlantıda çok fazla öğe olabileceğinden (çoktan çoğa veya birden çoğa). Sadece ikisini bağlamak iyi olur.
Mithril

11

fdpDosya için mizanpaj kullandığınızdan emin olun . neatoKümeleri desteklediğini sanmıyorum .


2
Ben de deneysel olarak neatomotor kümeleri desteklemediğini bulduk .. Bunun bir hata olup olmadığından emin değilim ..
Ross Rogers
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.