Вы можете рассматривать subgraph
как инструмент для логической группировки узлов и ребер.
Рассмотрите следующий пример (если вы не возражаете, я буду использовать собственный синтаксис Graphviz, а не оболочку Python Graphviz ):
digraph {
a -> b
c
d -> e
f
g -> h
c -> a
}

Теперь давайте добавим подграф вокруг узлов c
, d
и e
и изменим атрибуты глобального узла например, задайте им прямоугольную angular форму и красный цвет:
digraph {
a -> b
subgraph mysubgraph {
node [shape=rect color=red]
c
d -> e
}
f
g -> h
c -> a
}

Как видите, ничего не изменилось при размещении узла, но те узлы, которые были внутри подграфа, изменили форму и цвет. Также обратите внимание, что вы были правы: мы затронули и узел c
, который определен как узел, и узлы d;e
, которые неявно были определены как ребро.
Мы также можем использовать подграфы для управления размещение узла (и именно это подграфы используются в большинстве случаев) с атрибутом rank . Чтобы узлы в подграфе отображались в одной строке, добавьте к вашему подграфу атрибут rank=same
:
digraph {
a -> b
subgraph mysubgraph {
node [shape=rect color=red]
rank=same
c
d -> e
}
f
g -> h
c -> a
}

Кластеры полностью другая история. Когда вы добавляете слово «кластер» в начало имени вашего подграфа, узлы, которые определены внутри этого кластера, будут физически собраны вместе. Вы также получите прямоугольник (по умолчанию), оборачивающий эти узлы на вашем графике:
digraph {
a -> b
subgraph cluster_mysubgraph {
node [shape=rect color=red]
c
d -> e
}
f
g -> h
c -> a
}

Обратите внимание на разницу между этим и вторым изображением , Я предлагаю вам использовать кластеры с осторожностью. Если у вас есть соединения между узлами внутри и снаружи кластера, все может go странно с точки зрения компоновки.
Кстати, по официальным документам действительно трудно выучить garphviz, потому что они скорее справочные а не руководство. Но у них также есть хорошее руководство, написанное на хорошем языке для обычных людей (извините, математиков), но оно похоронено на сайте Graphviz: https://graphviz.gitlab.io/_pages/pdf/dotguide.pdf