【问题标题】:Graph node position in graphviz in pythonpython中graphviz中的图形节点位置
【发布时间】:2016-04-17 07:33:27
【问题描述】:

我一直在寻找在 python 中的 graphviz 中指定图中节点位置的方法。我在 dot 中找到了rank command 的子图,这是我正在寻找的,但我找不到在 python 中的 graphviz 中组合子图和排名的方法。我也尝试强制节点位置,但也没有工作。我创建了一个我想要实现的简单示例。

这是我的代码:

from graphviz import Digraph

top_nodes = ['a', 'b', 'c']

other_nodes = ['d', 'e', 'f', 'g', 'm', 'n']

g = Digraph('test', format='png')

for n in top_nodes:
    g.node(str(n), color='red')

for n in other_nodes:
    g.node(str(n))

g.edge('a', 'd')
g.edge('d', 'g')
g.edge('g', 'm')
g.edge('m', 'n')
g.edge('b', 'e')
g.edge('b', 'f')
g.edge('e', 'n')
g.edge('c', 'f')

g.view()

这是输出:

我希望红色节点(“来源”)位于同一级别的图表顶部,只要保留分层布局,其余节点的位置就不是那么重要了。

【问题讨论】:

    标签: python graph graphviz rank


    【解决方案1】:

    我遇到了同样的问题,发现使用子图可以解决问题。

    from graphviz import Digraph
    
    top_nodes = ['a', 'b', 'c']
    
    other_nodes = ['d', 'e', 'f', 'g', 'm', 'n']
    
    g = Digraph('test', format='png')
    s = Digraph('subgraph')
    s.graph_attr.update(rank='min')
    
    for n in top_nodes:
        s.node(str(n), color='red')
    
    for n in other_nodes:
        g.node(str(n))
    
    g.edge('a', 'd')
    g.edge('d', 'g')
    g.edge('g', 'm')
    g.edge('m', 'n')
    g.edge('b', 'e')
    g.edge('b', 'f')
    g.edge('e', 'n')
    g.edge('c', 'f')
    
    g.subgraph(s)
    
    g.view()
    

    image output

    【讨论】:

      【解决方案2】:

      从你的代码开始,使用子图context就够了,加

      with g.subgraph() as s:
          s.attr(rank = 'same')
          for n in top_nodes: s.node(n)
      

      这似乎比显式声明子图并将其添加到原始图更容易。

      顺便说一句,这个解决方案生成与@RaHo 答案中的ine 完全相同的DOT 源。

      digraph test {
          a [color=red]
          b [color=red]
          c [color=red]
          d
          e
          f
          g
          m
          n
          a -> d
          d -> g
          g -> m
          m -> n
          b -> e
          b -> f
          e -> n
          c -> f
          {
              rank=same
              a
              b
              c
          }
      }
      

      【讨论】:

        【解决方案3】:

        试试 rank = same 语句

        digraph G {
        a b c d e f g m n
        {rank = same; a; b; c;}
        a->d
        d->g
        g->m
        m->n
        b->e
        b->f
        e->n
        c->f
        }
        

        【讨论】:

        • 恐怕问题是关于如何使用the python library而不是原始点语言来获得这个结果。
        • 这根本不能回答问题。
        • {rank = min; a; b; c;} 为我做了。我从搜索引擎中找到了这个答案,但我没有使用 python。
        猜你喜欢
        • 1970-01-01
        • 2019-08-29
        • 1970-01-01
        • 2018-12-18
        • 2017-05-13
        • 1970-01-01
        • 1970-01-01
        • 2020-02-19
        • 2013-03-23
        相关资源
        最近更新 更多