我正在努力进行有向图层次结构树可视化(在这种情况下是分布式网络)。使用graphviz:dot我有这棵树:
digraph G {
node[width=0.14, height=0.14];
edge[weight=3, color = "0.000 0.000 0.0"];
1 -> 2;
1 -> 3;
edge[weight=2, color = "0.000 0.000 0.175"];
2 -> 4;
2 -> 5;
3 -> 6;
3 -> 7;
edge[weight=1, color = "0.000 0.000 0.825"];
3 -> 4;
3 -> 5;
2 -> 6;
2 -> 7;
}
您可以看到主要路径(权重较高的边)交叉。目标是使首选路径节点尽可能接近。我可以通过随机改变节点的顺序来做到这一点,所以输出如下所示:
但是,我不想考虑排序算法,因为我想在数百个节点上实现自动化。
来自文档:
边缘的重量提供了另一种保持边缘平直的方法。边缘的重量表明边缘重要性的某种程度;因此,重量越重,其节点应该越靠近。点会使重量较重的边缘变得更短更直。
但事实并非如此,因为节点是按随机顺序绘制的。我做错了什么?
答案 0 :(得分:1)
可能不是你要找的答案,但是因为在这种情况下dot似乎不适用于边缘权重:
您可以使用constraint=false
作为浅灰色边缘。
答案 1 :(得分:0)
你能否接受这样的解决方案,它会放置隐形排名和不可见边缘来强制执行从节点到左右的排序?虽然它在图的左侧增加了一些空白区域,但至少它可以巧妙地解决每个等级中的随机排序问题,并有助于实现自动化。
digraph G {
node[width=0.14, height=0.14];
{
rankdir="TB";
edge [style=invis];
rank1 [style=invis];
rank2 [style=invis];
rank3 [style=invis];
rank1 -> rank2 -> rank3 [style=invis];
}
edge[weight=3, color = "0.000 0.000 0.0"];
1 -> 2;
1 -> 3;
edge[weight=2, color = "0.000 0.000 0.175"];
2 -> 4;
2 -> 5;
3 -> 6;
3 -> 7;
{
edge [style=invis];
rank=same;
rank2 -> 2 -> 3;
}
edge[weight=1, color = "0.000 0.000 0.825"];
3 -> 4;
3 -> 5;
2 -> 6;
2 -> 7;
{
rank=same;
edge [style=invis];
rank3 -> 4 -> 5 -> 6 -> 7 ;
}
}