W DOT
języku dla GraphViz
staram się przedstawić diagram zależności. Potrzebuję mieć węzły w kontenerze i móc uzależniać węzły i / lub kontenery od innych węzłów i / lub kontenerów.
Używam subgraph
do reprezentowania moich pojemników. Łączenie węzłów działa dobrze, ale nie mogę dowiedzieć się, jak połączyć podgrafy.
Biorąc pod uwagę poniższy program, muszę być w stanie połączyć się cluster_1
i cluster_2
za pomocą strzałki, ale wszystko, czego próbowałem, tworzy nowe węzły zamiast łączyć klastry:
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";
}
fdp
. Połączony przykład, jak i ten powyżej, działają (ostatnia linia w tym przykładzie musi zawierać nazwy podgrafów, a nie etykietę i może być miło dołączyć długości linii dla wykresu); jest trochę napięty).fdp
2.28.0 i kopiując / wklejając źródło z przykładu, linie łączą się ze środkiem podgrafu, a nie z krawędziami. Jeśli otworzysz .dot w OmniGraffle są prawidłowo podłączone, podczasneato
idot
zarówno tworzyć zbędnych węzłów do klastra.Odpowiedzi:
Podręcznik użytkownika DOT zawiera następujący przykład wykresu z klastrami z krawędziami między skupieniami:
... i krawędzie między węzłami i klastrami:
źródło
DUMMY_0 [shape=point style=invis]
Dla ułatwienia rozwiązanie opisane w odpowiedzi HighPerformanceMark, zastosowane bezpośrednio do pierwotnego pytania, wygląda następująco:
compound=true
Wgraph
deklaracji jest niezbędna. To daje wynik:Zauważ, że zmieniłem krawędzie na węzły odniesienia w klastrze, dodałem atrybuty ltail i lhead do każdej krawędzi, określając nazwę klastra i dodałem atrybut na poziomie wykresu „związek = prawda”.
Jeśli chodzi o obawy, że ktoś może chcieć połączyć klaster bez żadnych węzłów w nim, moim rozwiązaniem było zawsze dodawanie węzła do każdego klastra, renderowanego za pomocą style = zwykły tekst. Użyj tego węzła, aby oznaczyć klaster (zamiast wbudowanego atrybutu „label” klastra, który powinien być ustawiony na pusty ciąg (w Pythonie
label='""'
). Oznacza to, że nie dodam już krawędzi, które bezpośrednio łączą klastry, ale działa w mojej konkretnej sytuacji.źródło
cluster_0 -> cluster_1
prezent podczas drukowania. Ponieważ może być wiele elementów w klastrze_0, łącze do wielu innych elementów w klastrze_1 (wiele do wielu lub jeden do wielu). Dobrze byłoby po prostu połączyć dwa.Upewnij się, że używasz
fdp
układu dla pliku. Myślę, że nieneato
obsługuje klastrów.źródło
neato
silnik nie obsługuje klastrów .. Nie jestem pewien, czy to jest błąd, czy nie ..