Graphviz:创建从结构到自身的非重叠边

Graphviz:创建从结构到自身的非重叠边,graphviz,Graphviz,我正试图在graphviz中重新创建一个类似于以下图表的图表: 我在Python中使用以下代码: s = Digraph(node_attr={'shape': 'record'}) s.node('struct', '<f0> 3|<f1> 13|<f2> 1|<f3> 2|<f4> 8|<f5> 5') s.edge("struct:f0", "struct:f1") s.edg

我正试图在graphviz中重新创建一个类似于以下图表的图表:

我在Python中使用以下代码:

s = Digraph(node_attr={'shape': 'record'})
s.node('struct', '<f0> 3|<f1> 13|<f2> 1|<f3> 2|<f4> 8|<f5> 5')
s.edge("struct:f0", "struct:f1")
s.edge("struct:f0", "struct:f2")
s.edge("struct:f1", "struct:f3")
s.edge("struct:f1", "struct:f4")
s
s=Digraph(node_attr={'shape':'record'})
s、 节点('struct','3 | 13 | 1 | 2 | 8 | 5')
s、 边(“结构:f0”、“结构:f1”)
s、 边缘(“结构:f0”、“结构:f2”)
s、 边(“结构:f1”、“结构:f3”)
s、 边(“结构:f1”、“结构:f4”)
s
结果是:

这非常接近我想要的,除了边缘与节点重叠,而不是在节点的上方/下方

我找不到修改边缘行为的方法。另外,我感觉我误用了graphviz的结构特性,但我不知道如何强制图形元素粘在一起,否则就无法将它们粘在一行中

我可以避免边缘重叠(当然,除了自己修改SVG)还是完全使用不同的方法?

您可以使用“端口”来设置连接点

我在网上服务上试用了你的图形,看起来你的渲染是用圆点的

您可以使用其他单元格进行测试,Circo和其他单元格不交叉,但默认情况下,它们都在一侧(底部)绘制,并且边缘凌乱

但是,有一些“端口”属性允许通过指定后缀“:s”、“:n”等来解决此问题。n、s、e、w、nw、ne、sw、s-i、 e.南部、北部等

看起来Dot与Circo和Neato有不同的默认端口,后者可以:

digraph Structs {
    node [shape=record];        
    s [label="<f0> 3|<f1> 13|<f2> 1|<f3>2|<f4>8|<f5>5"];
    s:f0 -> s:f1;
    s:f0 -> s:f2;
    s:f1:n -> s:f3:n;
    s:f1:n -> s:f4:n;
}
见:


您可以在在线服务中选择渲染引擎吗?:“用于渲染图形描述的布局命令(点、circo、neato等)”,也可以尝试几种。
digraph Structs {
    node [shape=record];       
    s [label="<f0> 3|<f1> 13|<f2> 1|<f3>2|<f4>8|<f5>5"];
    s:f0:s -> s:f1:s;
    s:f0:s -> s:f2:s;
    s:f1:n -> s:f3:n;
    s:f1:n -> s:f4:n;
}
s.edge("struct:f0:s", "struct:f1:s")
s.edge("struct:f0:s", "struct:f2:s")
s.edge("struct:f1:n", "struct:f3:n")
s.edge("struct:f1:n", "struct:f4:n")