以下跟随点文件演示了我要解决的问题:
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"];
}
它生成以下图形:
标签位置不佳,几乎重叠。
可以采取哪些措施来改善此图形的外观?
我会定义改进的意思是说(1)标签彼此不重叠,(2)标签不与边缘重叠,以及(3)可选/理想地标签沿边缘绘制。 #3不可能,但#1和#2应该足够。使用正交样条线将始终提供一个边缘,可以沿着该边缘绘制标签,并且仍然可以正常读取,但是我知道graphviz当前不支持此功能。
“改进”在旁观者眼中,但这使用端口,标题标签,空格和换行符来重新排列标签。
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
}