【问题标题】:I need to switch the position of two nodes in Graphviz我需要在 Graphviz 中切换两个节点的位置
【发布时间】:2017-08-02 12:29:48
【问题描述】:

这是我正在尝试创建的 graphviz digraph 的代码。下面是这个创建的示例图像,我想用'e'切换节点'a',我需要用'd'切换节点'b'。我也尝试过改变他们在代码和其他东西中的位置。我目前拥有的和我想要的示例在下面的链接中。

digraph {

    graph[nodesep=1.75, ranksep=1.25, pad=".5", rankdir=LR];

    node[shape=circle];
    F[label=f];
    A[label=a];
    E[label=e];
    B[label=b];
    D[label=d];
    C[label=c];

    {rank=min; F};
    {rank=same; A; E};
    {rank=same; B; D};
    {rank=max; C};

    F -> {D};
    A -> {B D F};
    E -> {D F};
    B -> {C F};
    D -> {B};
    C -> {D};
}

Current Plot

Desired Plot

【问题讨论】:

    标签: tree nodes graphviz


    【解决方案1】:

    我非常接近这个实现,尽管仍然很难将 E 与 D 水平对齐。但是这个方案使用不可见的定向链接按照您指定的顺序获取节点,这些定向链接根据等级强制执行顺序。

    digraph { 
    rankdir=LR;
    node[shape=circle];
    nodesep=1.75; ranksep=1.25; pad=0.5;
    
    {rank=same; rank=min; F; }
    {rank = same; A -> E [style=invis]; }
    {rank= same; B -> D [style=invis]; }
    {rank=same; rank=max; C;}
    
    F[label=f];
    A[label=a];
    E[label=e];
    B[label=b];
    D[label=d];
    C[label=c];
    
    A -> B;
    A -> D;
    A-> F;
    B-> C;
    B-> F;
    C-> D;
    D-> B;
    F-> D;
    
    nodesep=0.75;
    E -> D;
    E-> F;
    }
    

    【讨论】:

    • 如何对齐'e'?
    • @MichaelDiCioccio 我不知道,我的朋友。今天早上我试了试。我意识到,为什么它被渲染出来很奇怪。
    • 这太疯狂了,谢谢。我会尝试从您的回答中找出答案,但从技术上讲,您确实回答了我的问题,所以这将获得绿色检查。
    • 我很感激。我通常从 DOT 得到我想要的东西,但我已经尝试了我能想到的一切,甚至删除了 pad 属性。祝你好运!
    • 我刚开始使用 Graphviz (DOT),它有非常可靠的文档,但是当你遇到问题时,你会觉得很不走运,哈哈
    【解决方案2】:

    我更正了上面的代码,并结合@JLH 的答案解决了我自己的问题。

    digraph {
    
        graph[nodesep=1, ranksep=1, pad=".5"];
        rankdir="LR";
    
        node[shape=circle];
        F[label=f];
        A[label=a];
        E[label=e];
        B[label=b];
        D[label=d];
        C[label=c];
    
        {rank=min; F};
        {rank=same; A E}
        {rank=same; B D}
        {rank=max; C};
    
        F -> {D};
        A -> {B D F};
        E -> {D F};
        B -> {C F}
        D -> {B};
        C -> {D};
    
        edge[style=invis];
        A -> E
        E -> B
        B -> D
    }
    

    答案的关键是在 E 和 B 之间添加一个无形的连接,将 E 拉回事物的循环中。

    【讨论】:

      猜你喜欢
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 2013-03-23
      • 2018-08-23
      • 2016-04-17
      • 1970-01-01
      相关资源
      最近更新 更多