【发布时间】:2020-01-26 04:05:56
【问题描述】:
我有一个图表,其中对象的实例有时会调用自己。这是使用 dot 布局引擎。
digraph G {
foo;
foo -> foo [label="msg1"];
foo -> foo [label="msg2"];
foo -> foo [label="msg3"];
}
这在渲染的图表中造成了一些混乱,因为它们最终都在同一个位置。
将它们分开一点最简单/最好的方法是什么?我想一个蛮力方法是添加隐藏节点n1, n2, n3然后foo -> n1; n1->foo; foo -> n2;...
我可能正在查看每个节点最多 7-8 条自引用消息的顺序,但 3-4 条的解决方案将是一个好的开始。
这是对隐藏节点方法的尝试。也不是很好。删除不可见节点上的label 属性仍然会在箭头之间留下空隙。
digraph G {
foo;
foo -> n1 [label="msg1" dir="none"];
n1 -> foo;
foo -> n2 [label="msg2" dir="none"];
n2 -> foo;
foo -> n3 [label="msg3" dir="none"];
n3 -> foo;
n1 [ label = "", style = invis ];
n2 [ label = "", style = invis ];
n3 [ label = "", style = invis ];
}
到目前为止,我管理过的最好的(实际边缘标签很长,所以我添加了它以查看结果)是使用 n1、n2、n3 中间节点,不是隐藏的,而是使用shape="plaintext":
digraph G {
foo;
foo -> n1 [dir="none"];
n1 -> foo;
foo -> n2 [dir="none"];
n2 -> foo;
foo -> n3 [dir="none"];
n3 -> foo;
n1 [ shape="plaintext" label="msg111111111111111111111111111"];
n2 [ shape="plaintext" label="msg222222222222222222222222222" ];
n3 [ shape="plaintext" label="msg333333333333333333333333333" ];
}
给予:
编辑:寻找与 dot 相关的答案,因为我有时会将 DOT 传递给专门的渲染库,例如 d3-graphviz,我知道这适用于 dot,不确定其他布局引擎。
【问题讨论】:
-
您可以通过在两端为每个边缘指定不同的、明确的端口方向来强制在您的自边缘之间进行一些分离:
foo:n -> foo:n、foo:ne -> foo:ne等等。恐怕结果仍然不是很好。 -
@jasonharper 感谢您的建议,但是,是的,它们仍然有些混乱,与其说是边缘箭头,不如说是间隔的边缘标签,而不是始终如此.
标签: graphviz