【问题标题】:edge connections overlap and don't space out边缘连接重叠并且不间隔
【发布时间】:2019-10-05 00:13:40
【问题描述】:

我也在尝试看看是否可以使用 Dot 编程语言将其应用到我的旧项目中。

任务很简单:轻松创建高质量图表。

不幸的是,虽然实现图表的细节相当容易,但我最终不得不花费大量时间来调整布局。 此外,我不清楚我的指令顺序如何影响我的图表,但实际上看起来将我的代码的最后一条指令放在开头会产生完全不同的输出!

代码如下:

digraph {
TOP [shape=doublecircle]
TOP->TOP->{rank=same a->b->c->b->a}
a:s->c:s
a:nw->a:sw
c:ne->c:se
b:s->b:s
}

所以。首先,我终于通过排名掌握了“让节点在同一水平/垂直线上”...

我还解决了边缘进行愚蠢互连的问题(图下方的所有可用空间用于连接,并且边缘以一种尴尬的方式在整个图上蜿蜒曲折并重叠所有内容?)使用方向指示器“ :e" 之类的(我相信它们被称为路线......),但看起来 graphviz 并没有以聪明的方式使用它们,因为结果对我来说看起来很有趣。

这是输出,我如何获得它以避免边缘重叠并为未来的(long)标签留出足够的空间?

(用dot -Tpng test.dot -o test.png制作)

(另外,我还需要在底部添加一个 c->a 边缘,但是添加一个“正常”方式会破坏一切)

【问题讨论】:

  • 如果您想要高质量(“准备好发布”),您可能想要使用 LaTeX / tikz。 graphviz 只给你有限的控制权。

标签: graph graph-theory graphviz dot edges


【解决方案1】:

您可以根据需要使用不可见节点“重新路由”您的边缘(根据下面的 cmets 进行编辑):

digraph
{
    /* layout */
    // node width to create space for longer labels
    node [ width = 1.75 ];
    { rank=same; a; b; c }

    /* nodes */
    t [ label = "TOP", shape = doublecircle, width = 1];
    a [ label = "short" ];
    b [ label = "medium" ];
    c [ label = "rather  l o n g"]
    // invisible nodes to 're-route' the edges
    x [ style = invis, shape = point, width = 0 ];
    y [ style = invis, shape = point, width = 0 ];

    /* edges */
    t -> t;
    t -> { a b c }
    t -> { a b c } [dir = back ];      // added for reverse arrows
    a -> b -> c -> b -> a;
    a:nw -> a:sw;
    c:ne -> c:se;
    b:s -> b:s;
    // put the invisible nodes at the desired places with invisible edges
    b -> x -> y [ style = invis ];
    // edges to invisible nodes must not have heads
    c:sw -> x [ arrowhead = "none" ];
    x -> a:se;
    a:s ->  y [ arrowhead = "none" ];
    y -> c:s;
}

产量

【讨论】:

  • 哇,非常整洁!不幸的是,我不明白为什么需要这样的技巧才能让布局与点一起使用......有没有人可以推荐的替代语言?
  • 还有一件事。将t -> {a b c} 更改为t -> {a b c} -> t 给了我这个horrible picture ...
  • 你想达到什么目的?单线很聪明,但有时太聪明了……顺便说一句,在两个方向都有箭头/指针的边缘有什么问题吗?
  • 替代语言 - 我只知道 LaTeX / tikz 它可以为您提供完整的功能,但有更多的学习曲线。 dia 是一种所见即所得的方法,我不太了解它,但我想你可以使用它。一旦你朝着那个方向前进,inkscape 就会受到高度赞扬。
  • 在 /* 边 */ 下添加 t -> { a b c } [dir = back ]; 作为第三行。这应该给你你想要的,而不是你的“可怕的图片”......假设我的理解是正确的,我已经编辑了答案和图表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多