graphviz - 如何在矩形布局中安排循环中的节点?

时间:2014-01-26 05:05:37

标签: layout graphviz dot

前脚本

......就在我完成这些例子的制作时,我看到了'roundtrip' flow topic,看起来不错。 既然我已经把它放在这里,不妨问:还有其他选择吗?

原帖

有没有办法在子图中自动布局矩形布局中的节点?

举个例子,假设我有给定的结构:

digraph
{
    rankdir="LR";

    node [ shape="circle", style="bold, filled", fillcolor="#dddddd" ];

    a -> b -> c -> d -> e -> f -> g -> h -> b;
}

这会产生图表 test_1

我的目标是让它们排成一个有三个节点行的矩形,形成

如果我尝试约束排名并更改rankdir,则不符合预期(我假设因为您无法像这样更改rankdir):

digraph
{
    rankdir="LR";

    node [ shape="circle", style="bold, filled", fillcolor="#dddddd" ];

    a -> b -> c -> d -> e -> f -> g -> h -> b;

    subgraph
    {
        rankdir="TB";
        rank="same";
        c; d; e;
    }

    subgraph
    {
        rankdir="TB";
        rank="same";
        f; g; h;
    }
}

test_2

如果我通过手动操作并根据需要将排名分配到排队,则可以:

digraph
{
    rankdir="LR";

    node [ shape="circle", style="bold, filled", fillcolor="#dddddd" ];

    a -> b -> c -> d -> e -> f -> g -> h -> b;

    { rank="same"; c; h; }
    { rank="same"; d; g; }
    { rank="same"; e; f; }
}

test_3

修改

刚试过这个方法,效果很好。我确实不得不取消最右边的边缘,以防止它形成不对称的形状,但总体来说就像一个魅力(更直观)!

digraph
{
    rankdir="LR";

    node [ shape="circle", style="bold, filled", fillcolor="#dddddd" ];

    a -> b -> c -> d -> e;
    e -> f [ constraint="false" ];
    b -> h -> g -> f [ dir="back" ];
}

enter image description here

1 个答案:

答案 0 :(得分:2)

不知道在哪里放这个,但我会继续把它作为旁边的答案发布在这里。

我尝试了一个更大的周期:

digraph
{
    rankdir="LR";

    node [ shape="circle", style="bold, filled", fillcolor="#dddddd" ];

    x -> y;
    y -> aa [ constraint="false" ];
    aa -> ab -> ac -> ba;

    { rank="same"; ba -> bb -> bc -> ca; }

    da -> cc -> cb -> ca [ dir="back" ];

    { rank="same"; aa -> dc -> db -> da [ dir="back" ]; };

}

enter image description here

还尝试了蛇形图案:

digraph
{
    rankdir="LR";

    node [ shape="circle", style="bold, filled", fillcolor="#dddddd" ];

    x -> y;
    y -> aa [ constraint="false" ];
    aa -> ab -> ac;
    ac -> ba [ constraint="false" ];
    bc -> bb -> ba [ dir="back" ];

    bc -> ca [ constraint="false" ];
    ca -> cb -> cc;

    cc -> da [ constraint="false" ];
    dc -> db -> da [ dir="back" ];

    y -> dc [ dir="back", constraint="false" ];

    // { rank="same"; aa; bc; ca; dc; };
}

这个还是有点乱。

enter image description here