【问题标题】:Graphviz crossing edgesGraphviz 交叉边
【发布时间】:2014-09-25 04:27:20
【问题描述】:

我试图避免跨越 20->40 和 30->70 之间的界线。有谁知道如何做到这一点?我使用单点来拉直边缘,但我希望渲染引擎避免这些边缘重叠。这是我的点代码:

digraph {
graph [splines="ortho", nodesep = "1", overlap = false];
node [shape=rectangle, color=lightgrey, style=filled ];

10
20
30
40
50
60
70
80
90


node[shape=none, width=0, height=0 label=""];
edge[dir=none];

{rank=same;
p1->10
10->p2
}

p1->20
p2->30


{rank=same;
p3->40
40->p4
}

p3->50
p4->60


{rank=same;
p5->70
70->p6
}

p5->80
p6->90


20->40
30->70
}

我想发布一张图片,但 stackoverflow 不允许我这样做...当您将代码复制到:http://stamm-wilbrandt.de/GraphvizFiddle/

时,您可以看到我的意思

非常感谢您在这方面的帮助!

【问题讨论】:

  • +1 获取 GraphvizFiddle 的链接 - 不知道这个工具,好东西!

标签: graphviz dot


【解决方案1】:

您可以通过在 p4 和 dp5 之间添加不可见边来给 graphviz 一个提示:

{
    rank=same;
    p3 -> 40;
    40 -> p4;
    p4 -> p5 [style=invis]; // new invisible edge
    p5 -> 70;
    70 -> p6;
}

如果您无法添加不可见边(动态图生成),请确保作为子图一部分的节点确实首先出现在子图中,因此避免预先定义节点。

在此示例中,我删除了脚本开头的节点定义并内联了肘关节节点的样式。

Here's the GraphvizFiddle

digraph {
graph [splines="ortho", nodesep = "1", overlap = false];
node [shape=rectangle, color=lightgrey, style=filled ];

//node[shape=none, width=0, height=0, label=""];
edge[dir=none];

{
 rank=same;
 p1[shape=none, width=0, height=0, label=""];
 p2[shape=none, width=0, height=0, label=""];
 p1->10
 10->p2
}

p1->20
p2->30

{
 rank=same;
 p3[shape=none, width=0, height=0, label=""];
 p4[shape=none, width=0, height=0, label=""];
 p3->40
 40->p4
}


p3->50
p4->60

{
 rank=same;
 p5[shape=none, width=0, height=0, label=""];
 p6[shape=none, width=0, height=0, label=""];
 p5->70
 70->p6
}

p5->80
p6->90


20->40
30->70

}

【讨论】:

  • 谢谢,这适用于这个静态示例!我怎样才能使它在动态模式下工作?我事先不知道节点将在什么“级别”显示,因此动态添加隐藏边缘似乎很困难......非常感谢您的帮助!
  • 我和你一起讨论隐形边缘!我添加了一个更通用的解决方案,希望它适用于您的实际案例。
  • 越来越近了!所以不提供节点定义使这项工作......不幸的是,我确实需要定义节点,因为节点的高度和宽度是根据标签大小计算的......
  • 在上面的示例中,节点确实具有与之前完全相同的属性(高度、宽度、标签),唯一的区别是它们没有被列在最前面。如果您有一些预先计算的宽度/高度(graphviz 外部),您仍然可以首先使用其属性声明节点,只需在它首先出现的子图中执行此操作(如 p1、p2 ......节点)。
  • 太好了,我在您之前的评论之后发现了这一点。再次感谢您的帮助。
猜你喜欢
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多