我已将问题简化为以下简单示例:
digraph {
subgraph {rank=same; 0 -> 1 -> 2;}
0 -> 2 [label="A"];
2 -> 0 [label="B"];
}
产生
在保持0,1和2处于相同等级的同时(原始示例在较大图形的上下文中),我需要A和B边缘是可辨别的。即边缘与标签明显匹配,标签可读。
我想象的一个解决方案是在
指定的边缘连接上使用端口0:ne -> 2:nw [label="A"];
2:sw -> 0:se [label="B"];
然而这会产生
其他想法?我正在生成具有相同问题的更大图表,因此最佳解决方案不是完全临时手动放置边/标签。
编辑:较大生成图表的一个(仍然简化的)示例如下:
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"];
}
这会产生:
在上面的简单示例中表现出相同的边缘/标签重叠问题。
其他说明:
答案 0 :(得分:2)
第一个例子显然是一个错误;边缘标签应位于不同的位置,然后将边缘分开。 (一般来说,我们知道扁平边缘代码中存在漏洞,特别是处理标签。)一种解决方法是将部分或全部边缘标签视为外部标签:
digraph {
subgraph {rank=same; 0 -> 1 -> 2;}
0 -> 2 [xlabel="A"];
2 -> 0 [xlabel="B"];
}
关于更改上一个答案中提到的标签字体颜色的问题,可以使用类似HTML的标签来完成:
0 -> 2 [dir="both", color="black:gray", labeldistance="2",
headlabel=<<font color="red">A</font>>, taillabel="B"];
这可以用于代替通常的双引号字符串的任何文本。
答案 1 :(得分:1)
您可以使用dir="both"
和colorList。
digraph {
subgraph {rank=same; 0 -> 1 -> 2;}
0 -> 2 [dir="both", color="black:gray", labeldistance="2", headlabel="A", taillabel="B"];
}
结果如下:
我不得不使用labelDistance
来保持“A”标签不会被绘制在箭头顶部。不幸的是,我无法弄清楚如何为头部标签和尾部标签单独更改字体颜色,以便更清楚地说明哪个标签适用于哪个箭头。
答案 2 :(得分:0)
来自ssteve和emden的答案都非常有用且受到了赞誉。 (谢谢你们两个!)
我正在整合两者的输入并在更复杂的版本中回答这个问题。我仍然不觉得解决方案是完美的,但它是迄今为止我能产生的最好的解决方案。未来的答案可以改进(见下面似乎仍然缺乏的东西)以及以可自动化的方式处理较大的图形版本(见问题)将代替这个答案。
首先,到目前为止总结的最佳解决方案:将标签转换为xlabels,用于一些边缘(例如,所有双向边缘的一半,随机选择)和随机颜色边缘和相应的标签(通过fontcolor
)。
具体来说,这是一个解决方案的实例,其中边缘是随机的红色,绿色或黑色:
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"];
}
这会产生:
这仍然不完全令人满意,因为:
我试过的其他事情:
dir="both"
+色列表solution。颜色边缘随机。并且为头部和尾部标签随机设置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"];
}
这会产生:
征求其他想法/改进......