具有备用路径的分层树中节点的随机位置

时间:2017-06-08 07:40:52

标签: graphviz

我正在努力进行有向图层次结构树可视化(在这种情况下是分布式网络)。使用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;
}

导致: messy output

您可以看到主要路径(权重较高的边)交叉。目标是使首选路径节点尽可能接近。我可以通过随机改变节点的顺序来做到这一点,所以输出如下所示: desired output

但是,我不想考虑排序算法,因为我想在数百个节点上实现自动化。

来自文档:

  

边缘的重量提供了另一种保持边缘平直的方法。边缘的重量表明边缘重要性的某种程度;因此,重量越重,其节点应该越靠近。点会使重量较重的边缘变得更短更直。

但事实并非如此,因为节点是按随机顺序绘制的。我做错了什么?

2 个答案:

答案 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 ;
    }
}