Python / Graphviz - Как я могу обеспечить порядок узлов, а также использовать кластеры? (Они кажутся взаимоисключающими) - PullRequest
0 голосов
/ 02 ноября 2019

Насколько я могу судить, в Python Graphviz нельзя использовать подграфы для упорядочивания ОБА узлов и для кластеризации. Есть ли решение или обходной путь для этого? Или это ограничение Graphviz или его реализации на Python? Кажется, кластеризация требует использования подграфов и единственных примеров принудительного ранжирования / упорядочения узлов, которые я видел, также использовали подграфы.

Если вы не уверены, что я имею в виду под «упорядочением узлов», здесьрабочий пример того, как обеспечить порядок узлов (используя rank = same в подграфе): Как я могу контролировать порядок узлов уровня в точке graphviz?

Я пытался эмулировать это решениено и добавить в кластеризацию. Кажется, что кластеризация разрушена, когда подграфы для заказа созданы. Удаление кластеризации из приведенного ниже кода, и пример работает так же, как в приведенной выше ссылке, и удаление упорядочивающих / ранжирующих частей кода и кластеризация работает нормально. Таким образом, только комбинация обоих, кажется, вызывает проблему.

Возможно, есть что-то фундаментальное, чего я просто не понимаю.

Любая помощь очень ценится!

from graphviz import Graph, Digraph, Source

myedges = [('A', 'D'),
           ('A', 'B'),
           ('A', 'C'),
           ('A', 'E'),
           ('B', 'F'),
           ('C', 'F'),
           ('F', 'G')]

r = Digraph('root', format='png', filename='testing.gv')
r.node('rank1')
r.node('rank2')
r.node('rank3')
r.edge('rank1', 'rank2')
r.edge('rank2', 'rank3')
with r.subgraph(name='cluster1') as c:
    c.attr(color='red')
    c.node('B')
    c.node('D')
    c.node('G')
with r.subgraph(name='cluster2') as d:
    d.attr(color='red')
    d.node('A')
    d.node('C')
    d.node('E')    
    d.node('F')
for e in myedges:
    a, b = e
    r.edge(a,b)
with r.subgraph() as s:
    s.attr(rank='same')
    s.edge('rank2', 'B')
    s.edge('B', 'C')
    s.edge('C', 'D')
    s.edge('D', 'E')
    s.graph_attr['rankdir'] = 'LR'
with r.subgraph() as t:
    t.attr(rank='same')
    t.edge('rank3', 'F')
    t.edge('F', 'G')
    t.graph_attr['rankdir'] = 'LR'

print r
r.view()

Если это поможет, приведенный выше код генерирует структуру точек:

digraph root {
        rank1
        rank2
        rank3
        rank1 -> rank2
        rank2 -> rank3
        subgraph cluster1 {
                color=red
                B
                D
                G
        }
        subgraph cluster2 {
                color=red
                A
                C
                E
                F
        }
        A -> D
        A -> B
        A -> C
        A -> E
        B -> F
        C -> F
        F -> G
        {
                graph [rankdir=LR]
                rank=same
                rank2 -> B
                B -> C
                C -> D
                D -> E
        }
        {
                graph [rankdir=LR]
                rank=same
                rank3 -> F
                F -> G
        }
}
...