Python/Graphviz如何执行节点顺序并同时使用集群(它们似乎相互排斥)

2024-09-29 21:40:15 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python Graphviz中,据我所知,不能将子图用于节点排序和集群。是否有解决方案或解决方法?或者这是Graphviz或其Python实现的一个限制?集群似乎需要使用子图,我看到的唯一一个强制排名/节点排序的例子也使用子图

如果您不确定我所说的“节点顺序”是什么意思,下面是一个如何强制执行节点顺序的工作示例(在子图中使用rank=same): How can I control within level node order in graphviz's dot?

我试图模仿这个解决方案,但也加入了集群。当用于排序的子图被创建时,聚类似乎被破坏。从下面的代码中删除集群,示例的工作方式与上面的链接中的工作方式相同,删除代码的排序/排名部分和集群的工作方式很好。因此,似乎只有两者的结合才是问题的根源

也许有一些基本的东西我只是不明白

非常感谢您的帮助

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
        }
}

Tags: node节点排序aswith集群colorattr

热门问题