метод подграфа в python графвиз? - PullRequest
0 голосов
/ 25 февраля 2020

Поэтому я пытаюсь использовать пакет graphviz на python, и у него есть метод с именем subgraph(), но я думаю, что он отличается от определения, широко используемого в теории сетей.

Насколько я знаю, подграф означает граф, узлы и ребра которого являются подмножествами другого графа.

В руководстве пользователя graphviz написано:
Добавить текущее содержимое данного аргумента единственного графа в качестве подграфа или вернуть менеджер контекста, возвращающий новый Экземпляр графа, созданный с заданными аргументами (имя, комментарий и т. д. c.), содержимое которых добавляется в качестве подграфа при выходе из блока with менеджера контекста.

Это пример из руководства пользователя

import graphviz
p = Graph(name='parent')
p.edge('spam', 'eggs')
c = Graph(name='child', node_attr={'shape': 'box'})
c.edge('foo', 'bar')

p.subgraph(c)

example

Согласно теории сетей, граф p должен иметь все узлы «спам», «яйца», «foo», «bar» и подграф c должно быть сделано из узлов и ребер, используемых в графе p.

Но это не так. Кажется, что метод subgraph () просто добавляет два графика в один. Я прав?

А что такое специальный кластерный подграф? (Если имя подграфа начинается с «кластера», механизм компоновки будет обрабатывать его как специальный кластерный подграф). Я не могу найти никакого результата в Google.

Спасибо

1 Ответ

1 голос
/ 26 февраля 2020

Вы можете рассматривать subgraph как инструмент для логической группировки узлов и ребер.

Рассмотрите следующий пример (если вы не возражаете, я буду использовать собственный синтаксис Graphviz, а не оболочку Python Graphviz ):

digraph {
    a -> b
    c
    d -> e
    f
    g -> h
    c -> a
}

original

Теперь давайте добавим подграф вокруг узлов c, d и e и изменим атрибуты глобального узла например, задайте им прямоугольную angular форму и красный цвет:

digraph {
    a -> b
    subgraph mysubgraph {
        node [shape=rect color=red]
        c
        d -> e
    }
    f
    g -> h
    c -> a
}

subragph

Как видите, ничего не изменилось при размещении узла, но те узлы, которые были внутри подграфа, изменили форму и цвет. Также обратите внимание, что вы были правы: мы затронули и узел 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
}

ranksame

Кластеры полностью другая история. Когда вы добавляете слово «кластер» в начало имени вашего подграфа, узлы, которые определены внутри этого кластера, будут физически собраны вместе. Вы также получите прямоугольник (по умолчанию), оборачивающий эти узлы на вашем графике:

digraph {
    a -> b
    subgraph cluster_mysubgraph {
        node [shape=rect color=red]
        c
        d -> e
    }
    f
    g -> h
    c -> a
}

cluster

Обратите внимание на разницу между этим и вторым изображением , Я предлагаю вам использовать кластеры с осторожностью. Если у вас есть соединения между узлами внутри и снаружи кластера, все может go странно с точки зрения компоновки.

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

...