如何在没有重叠标签的情况下使用 graphviz 定义图形

how to define a graph with graphviz without overlapping labels

下面的点文件演示了我试图解决的问题:

digraph G {
    splines=line;
    rankdir=LR;
    A -> B [label="a long label"];
    A -> C [label="a long label"];
    A -> A [label="a very long label"];
    A -> A [label="a very long label"];
    A -> D [label="a long label"];
}

生成如下图:

标签位置不佳,几乎重叠。

如何改进此图表的外观?

我会这样定义 improve (1) 标签不相互重叠,(2) 标签不重叠边缘,以及 (3) 可选地/理想地 标签沿着边缘绘制。 #3 可能不可能,但#1 和#2 应该足够了。使用正交样条总是会提供一个边缘,可以沿着该边缘绘制标签并且仍然可以正常读取,但我知道 graphviz 目前不支持这一点。

"Improve" 是旁观者的眼睛,但这使用端口、标题标签、空格和换行符来重新排列标签。

digraph G {
    splines=line;
    rankdir=LR;
    // use ports to rearrange edges 
    // then headlabel, spaces, and newlines (\n)
    A:n -> A:w [headlabel="a very long label    "];  
    A:s -> A:w [headlabel="a very long label    "];  
    A -> B [label="a long label"];
    A -> C [label="a long label"];
    A -> D [label="\n\na long label"];
}

在 GraphViz 中似乎没有任何满足边缘标签所需标准的受支持解决方案。我的解决方法是拆分两个节点之间的边并插入另一个包含边标签文本的节点。新节点的样式与常规节点不同。

GraphViz 布局算法在保持节点分离并且不允许边与节点重叠方面做得很好。

使用此解决方法更新测试用例,我有以下点文件:

digraph G {
    splines=ortho;
    rankdir=LR;

    AA1 [label="a very long label", shape="box", style = "filled", fillcolor = "#E6E6E6", color = "#FFFFFF" ] 
    AA2 [label="a very long label", shape="box", style = "filled", fillcolor = "#E6E6E6", color = "#FFFFFF" ] 
    AB1 [label="a long label", shape="box", style = "filled", fillcolor = "#E6E6E6", color = "#FFFFFF" ] 
    AC1 [label="a long label", shape="box", style = "filled", fillcolor = "#E6E6E6", color = "#FFFFFF" ] 
    AD1 [label="a long label", shape="box", style = "filled", fillcolor = "#E6E6E6", color = "#FFFFFF" ] 

    A   -> AA1 [arrowhead = "none" ];
    AA1 -> A 
    A   -> AA2 [arrowhead = "none" ];
    AA2 -> A 

    A   -> AB1 [arrowhead = "none" ];
    AB1 -> B

    A   -> AC1 [arrowhead = "none" ];
    AC1 -> C

    A   -> AD1 [arrowhead = "none" ];
    AD1 -> D
}

产生这个