【问题标题】:Set node direction on graphviz在graphviz上设置节点方向
【发布时间】:2012-01-19 00:51:24
【问题描述】:

假设这段代码使用neato:

graph sample {
  layout=neato
  overlap=false
  splines=true
  tailclip=false
  headclip=false
  A -- I
  A -- J
  A -- B
  A -- H
  A -- E
  A -- K
  B -- D
  B -- C
  B -- L
  C -- M
  C -- N
  C -- O
  D -- P
  D -- Q
  E -- R
  F -- A
  G -- F
  H -- J
}

这给了我们这个图表:

我需要放置一个节点X,始终固定在其父节点以南的位置。即,如果我放置另一个关系A -- X,则X 应始终位于A 的南边。而且我真的不在乎其他所有事情的结局。

我研究了pos 属性,但它似乎不是解决方案,因为X 并不是真正处于固定位置,而是相对于他的关系。

还有tailport 和headport,但它们只定义边缘从哪里出来/进入,但并不真正影响节点的方向。

更新

另外一张图片让事情更清楚:

我不需要整洁,但我不希望图形看起来像 UD 或 LR 点树,我不希望它是线性排序的。 circo、fdp、sfdp、twopi也可以。

【问题讨论】:

    标签: graphviz dot neato


    【解决方案1】:

    neato 程序支持多种模式,其中一种模式可能会给您想要的。特别是,如果您设置 mode=ipsep,您可以指定在布局期间遵守的点状约束。比如我拿你的图,用图属性

    mode=ipsep
    diredgeconstraints=true
    levelsgap=0.5
    

    第一个打开 ipsep 模式,第二个告诉模型支持有向边,如点, 最后一个指定分离的强度。然后我将边缘目录属性设置为无

    edge[dir=none]
    

    并添加一条边 A -- X [dir=1]

    dir=1 表示该边应引入方向约束。如果我然后运行neato,我会得到附加的图片。

    Graphviz 属性文档http://www.graphviz.org/content/attrs 提供了有关这些属性的更多信息。

    【讨论】:

    • 谢谢。根据您的指示,我最终得到的 X 节点与您的图表完全一样。但一边是指向南方,一边是对角线。我似乎无法让它完全南下。这可能吗?
    • 这不是我想要的,但你找不到比这更权威的答案了。所以有赏金。
    【解决方案2】:

    针对更新后的约束,一种解决方案是固定 A 和 X,然后围绕它们布置图形:

    graph sample {
    overlap=false;
    splines=true;
    tailclip=false;
    headclip=false;
    
    A [pin=true,pos="0,.2"]
    X [pin=true,pos="0,.1"]
    A -- I
    A -- J
    A -- B
    A -- H
    A -- E
    A -- K
    B -- D
    B -- C
    B -- L
    C -- M
    C -- N
    C -- O
    D -- P
    D -- Q
    E -- R
    F -- A
    G -- F
    H -- J
    A -- X
    

    我尝试了使用neato 和 fdp 进行布局,它似乎生成了一个你想要的图形。当然,如果您想对同一图中的任意节点对施加这样的约束,则此解决方案可能行不通。

    --- 较早的答案---

    如果您致力于使用neato,我不确定是否有一种方法可以在不修改后处理步骤中的图表的情况下解决问题。如果neato 只是一个方便的默认值,那么您应该能够通过使用 dot 作为布局引擎来解决您的问题,并使用“rankdir=UD”,如果 X 需要在正南,再加上一些额外的 kludges。

    如果你只需要约束来申请单个节点X,那么将X和A放在一个集群中就可以了:

    graph sample {
      rankdir=UD 
      layout=dot
      overlap=false
      // .. as before
      A -- X
      subgraph clusterone {
       style=invisible
       A
       X
      }
    }
    

    如果你需要一个严格的南向约束来应用到 A 的任意子节点上,那么这种聚类后跟下面描述的技巧:

    How to force all nodes in the same column in graphviz?

    可能会成功。 clusterrank=local 属性在这种情况下也可能有用,但我不确定。希望这会有所帮助。

    【讨论】:

    • neato 本身并不是一个要求,但我不希望图表看起来是有序的,这就是我使用neato 而不是 dot 的原因。
    猜你喜欢
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2019-08-29
    • 1970-01-01
    相关资源
    最近更新 更多