Graphviz 边缘无法辨别/边缘标签被覆盖

wat*_*nic 7 dot graphviz overlap subgraph rank

我已将我的问题简化为以下简单示例:

digraph {
subgraph {rank=same; 0 -> 1 -> 2;}
0 -> 2 [label="A"];
2 -> 0 [label="B"];
}
Run Code Online (Sandbox Code Playgroud)

产生

在此处输入图片说明

在将 0、1 和 2 保持在同一等级(原始示例是在更大图的上下文中)的同时,我需要可辨别 A 和 B 边。即边缘与标签清晰匹配,标签可读。

我想象的一种解决方案是在指定的边缘连接上使用端口

0:ne -> 2:nw [label="A"];
2:sw -> 0:se [label="B"];
Run Code Online (Sandbox Code Playgroud)

然而这会产生

在此处输入图片说明

其他想法?我正在生成具有相同问题的更大图形,因此最佳解决方案不是完全临时手动放置边/标签。

编辑:较大生成图的(仍然简化)示例如下。

digraph {
size = "6,8.5";
ratio = "fill";
node [shape = circle];
node [fontsize = 24];
edge [fontsize = 24];
{graph [rank=same]; edge[color=invis];1;}
{graph [rank=same]; edge[color=invis];2 -> 0 -> 3 -> 4;}
0 -> 0 [label="6: 0.1764"];
0 -> 4 [label="4: 0.1304"];
0 -> 3 [label="5: 0.1551"];
0 -> 2 [label="7: 0.1489"];
0 -> 1 [label="Z: 0.3893"];
4 -> 0 [label="6: 0.1237"];
4 -> 3 [label="5: 0.05201"];
4 -> 2 [label="7: 0.15  "];
4 -> 1 [label="Z: 0.4585"];
3 -> 0 [label="6: 0.1658"];
3 -> 4 [label="4: 0.13  "];
3 -> 3 [label="5: 0.1038"];
3 -> 2 [label="7: 0.1616"];
3 -> 1 [label="Z: 0.4388"];
2 -> 0 [label="6: 0.1661"];
2 -> 4 [label="4: 0.1295"];
2 -> 3 [label="5: 0.2078"];
2 -> 2 [label="7: 0.1406"];
2 -> 1 [label="Z: 0.356 "];
1 -> 0 [label="6: 0.1103"];
1 -> 4 [label="4: 0.2591"];
1 -> 3 [label="5: 0.1382"];
1 -> 2 [label="7: 0.08581"];
1 -> 1 [label="Z: 0.1906"];
}
Run Code Online (Sandbox Code Playgroud)

这产生:

在此处输入图片说明

在上面的简单示例中表现出相同的边缘/标签重叠问题。

其他注意事项:

  • 当在同一个秩子图中的一对双向连接的节点中间有一个节点时,就会出现这个问题。这可能是发现错误的条件的子集。
  • 无向图也存在这个问题。

wat*_*nic 1

ssteveemden的回答非常有用,并且已被投票。(谢谢你们俩!)

我正在整合双方的意见,并以更复杂的版本回答这个问题。我仍然不觉得这个解决方案是完美的,但它是迄今为止我能生成的最好的解决方案。对此进行改进的未来答案(参见下文,了解似乎仍然缺乏的内容)以及以可以自动化的方式解决更大的图形版本(参见问题)的答案将代替这个答案被接受。

首先,总结到目前为止最好的解决方案:将某些边缘的标签(例如,随机选择的所有双向边缘的一半)和随机颜色边缘和相应标签(通过fontcolor)转换为 xlabels。

具体来说,这是该解决方案的实例,其中边缘随机为红色、绿色或黑色:

digraph {
size = "6,10.5";
ratio = "fill";
node [shape = circle];
node [fontsize = 24];
edge [fontsize = 24];
{graph [rank=same]; edge[color=invis];1;}
{graph [rank=same]; edge[color=invis];2 -> 0 -> 3 -> 4;}
0 -> 0 [label="6: 0.1764"];
0 -> 4 [xlabel="4: 0.1304" color=blue fontcolor=blue];
0 -> 3 [xlabel="5: 0.1551" color=green fontcolor=green];
0 -> 2 [label="7: 0.1489" color=red fontcolor=red];
0 -> 1 [label="Z: 0.3893"];
4 -> 0 [xlabel="6: 0.1237" color=green fontcolor=green];
4 -> 3 [xlabel="5: 0.05201 " color=green fontcolor=green];
4 -> 2 [xlabel="7: 0.15" color=blue fontcolor=blue];
4 -> 1 [label="Z: 0.4585" color=red fontcolor=red];
3 -> 0 [xlabel="6: 0.1658"];
3 -> 4 [xlabel="4: 0.13" color=red fontcolor=red];
3 -> 3 [label="5: 0.1038" color=blue fontcolor=blue];
3 -> 2 [xlabel="7: 0.1616"];
3 -> 1 [label="Z: 0.4388"];
2 -> 0 [label="6: 0.1661" color=blue fontcolor=blue];
2 -> 4 [xlabel="4: 0.1295" color=red fontcolor=red];
2 -> 3 [label="5: 0.2078" color=green fontcolor=green];
2 -> 2 [label="7: 0.1406"];
2 -> 1 [label="Z: 0.356 "];
1 -> 0 [label="6: 0.1103" color=red fontcolor=red];
1 -> 4 [label="4: 0.2591" color=blue fontcolor=blue];
1 -> 3 [label="5: 0.1382" color=green fontcolor=green];
1 -> 2 [label="7: 0.08581 "];
1 -> 1 [label="Z: 0.1906"];
}  
Run Code Online (Sandbox Code Playgroud)

这会产生: 在此输入图像描述

这仍然不完全令人满意,因为:

  1. 尽管现在更容易追踪标签到其边缘,但使用 xlabel 时,一些标签会出现在奇怪的位置。(例如 2 -> 4 标签上方)
  2. 随机选择哪些标签成为 xlable 似乎是任意的。而且(据我所知)没有办法保证这总是能成功。

我尝试过的其他事情:

  • 将每个标签设为 xlabel。结果:一切都被压缩,标签相互重叠和模糊。
  • 对所有双向边使用 xlabel。结果:与上面相同的问题。
  • 使用不带颜色的 xlabel。结果:很难追踪哪个标签属于哪个标签。
  • 使用 ssteve 的dir="both"+ colorlist解决方案。随机给边缘上色。labeldistance并为头尾标签随机设置3 到 11 之间,以避免节点处的标签重叠。结果:这更难自动化,并且仍然会导致边缘标签重叠,并且标签很难追溯到它们对应的边缘。(见下文)

这是上面“我尝试过的其他事情”解决方案列表中最后一项的示例。

size = "6,8.5";
ratio = "fill";
node [shape = circle];
node [fontsize = 24];
edge [fontsize = 24];
{graph [rank=same]; edge[color=invis];1;}
{graph [rank=same]; edge[color=invis];2 -> 0 -> 3 -> 4;}
0 -> 0 [label="6: 0.1764"];
0 -> 4 [dir="both", color="yellow:blue", labeldistance="5", headlabel=<<font color="yellow">4: 0.1304</font>>, taillabel=<<font color="blue">6: 0.1237</font>>];
0 -> 3 [dir="both", color="blue:black", labeldistance="8", headlabel=<<font color="blue">5: 0.1551</font>>, taillabel=<<font color="black">6: 0.1658</font>>];
0 -> 1 [label="Z: 0.3893"];
4 -> 1 [label="Z: 0.4585"];
3 -> 4 [dir="both", color="green:red", labeldistance="5", headlabel=<<font color="green">4: 0.13</font>>, taillabel=<<font color="red">5: 0.05201</font>>];
3 -> 3 [label="5: 0.1038"];
3 -> 1 [label="Z: 0.4388"];
2 -> 0 [dir="both", color="yellow:blue", labeldistance="11", headlabel=<<font color="yellow">6: 0.1661</font>>, taillabel=<<font color="blue">7: 0.1489</font>>];
2 -> 4 [dir="both", color="black:red", labeldistance="5", headlabel=<<font color="black">4: 0.1295</font>>, taillabel=<<font color="red">7: 0.15</font>>];
2 -> 3 [dir="both", color="blue:green", labeldistance="8", headlabel=<<font color="blue">5: 0.2078</font>>, taillabel=<<font color="green">7: 0.1616</font>>];
2 -> 2 [label="7: 0.1406"];
2 -> 1 [label="Z: 0.356 "];
1 -> 0 [label="6: 0.1103"];
1 -> 4 [label="4: 0.2591"];
1 -> 3 [label="5: 0.1382"];
1 -> 2 [label="7: 0.08581 "];
1 -> 1 [label="Z: 0.1906"];
}
Run Code Online (Sandbox Code Playgroud)

这会产生:

在此输入图像描述

征求的其他想法/改进...