На DOT
языке для GraphViz
я пытаюсь представить диаграмму зависимостей. Мне нужно иметь возможность иметь узлы внутри контейнера и иметь возможность сделать узлы и / или контейнеры зависимыми от других узлов и / или контейнеров.
Я использую subgraph
для представления своих контейнеров. Связывание узлов работает просто отлично, но я не могу понять, как соединить подграфы.
Учитывая приведенную ниже программу, мне нужно иметь возможность подключаться cluster_1
и cluster_2
стрелкой, но все, что я пробовал, создает новые узлы вместо подключения кластеров:
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
. Связанный пример и вышеприведенный пример работают (последняя строка в примере здесь должна использовать имена подграфов, а не метку, и было бы неплохо включить длины строк для графа); это немного туго, как есть).fdp
v2.28.0 и скопируйте / вставьте источник из примера, линии соединяются с центром подграфа, а не с краями. Если вы откроете .dot в OmniGraffle, они будут правильно подключены,neato
иdot
оба будут создавать лишние узлы для кластера.Ответы:
В руководстве пользователя DOT приведен следующий пример графика с кластерами с ребрами между кластерами:
... и ребра между узлами и кластерами:
источник
DUMMY_0 [shape=point style=invis]
Для удобства пользования решение, описанное в ответе HighPerformanceMark, непосредственно примененное к исходному вопросу, выглядит следующим образом:
compound=true
Вgraph
декларации имеет жизненно важное значение. Это производит вывод:Обратите внимание, что я изменил ребра для ссылки на узлы в кластере, добавил атрибуты ltail и lhead для каждого ребра, указав имя кластера, и добавил атрибут уровня графа 'component = true'.
Что касается опасений, что кто-то может захотеть подключить кластер без узлов внутри него, мое решение состояло в том, чтобы всегда добавлять узел в каждый кластер с помощью style = plaintext. Используйте этот узел для маркировки кластера (вместо встроенного в кластер атрибута «label», который должен быть установлен на пустую строку (в Python,
label='""'
). Это означает, что я больше не добавляю ребра, которые соединяют кластеры напрямую, но это работает в моей конкретной ситуации.источник
cluster_0 -> cluster_1
подарок, как вы выходной. Потому что в cluster_0 может быть много элементов, ссылающихся на множество других элементов в cluster_1 (многие ко многим или от одного ко многим). Было бы хорошо просто связать два.Убедитесь, что вы используете
fdp
макет для файла. Я не думаю,neato
поддерживает кластеры.источник
neato
двигатель не поддерживает кластеры .. Я не уверен, если это ошибка или нет ..