Насколько я могу судить, в 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
}
}