Graphviz:以给定顺序绘制节点以正确绘制树

时间:2019-02-16 15:42:55

标签: graphviz

我正在尝试绘制一棵树,但是以下方法存在问题:

  • 使用“不可见”节点连接树的级别,
  • 使用“等级相同”在相同级别上绘制节点

使用此代码,我得到以下结果

graph G{
edge [arrowhead = none];
splines = ortho;
rankdir = LR;

node [ shape="box" fixedsize = true width = 4 height = 1];

{ rank = same; "C" }

{ rank = same; 
"B" 
"A"
}

{ rank = same; 
"F" 
"D" 
"E" 
}
node [ shape="cricle" width = 0 height = 0 style=invis];

{ rank = same; 
"B_Inv_Parent_1"
"C_Inv_Even_Children_0"
"A_Inv_Parent_1" 
}

{ rank = same; 
"F_Inv_Parent_2"
"D_Inv_Parent_2" 
"A_Inv_Even_Children_1"
"E_Inv_Parent_2" 
}

"C" -- "C_Inv_Even_Children_0";
"B_Inv_Parent_1" -- "C_Inv_Even_Children_0" -- "A_Inv_Parent_1";
"B_Inv_Parent_1" -- "B";
"A_Inv_Parent_1" -- "A";

"B" -- "F_Inv_Parent_2";
"F_Inv_Parent_2" -- "F";

"A" -- "A_Inv_Even_Children_1";
"D_Inv_Parent_2"  -- "A_Inv_Even_Children_1" -- "E_Inv_Parent_2";
"D_Inv_Parent_2" -- "D";
"E_Inv_Parent_2" -- "E";
}

I get following result

我在第3层遇到问题:在图片的顶部绘制了 D ,因此与 E 的连接不理想。 我希望得到与 C B A 相同的结果。

我认为问题出在节点定义的顺序上,但是,无论以什么顺序定义它们,我都无法使其正常工作。

任何人都可以发现我的代码中的另一个问题并提出建议吗?

1 个答案:

答案 0 :(得分:0)

我已经清理了您的代码并重新排列了几行-毕竟,我认为是介绍

F_Inv_Parent_2 -- D_Inv_Parent_2  -- A_Inv_Even_Children_1 -- E_Inv_Parent_2;

一直是关键。您无需定义边缘箭头,因为您没有有向图,并且shape="cricle"中有一个错字。

这是我的编辑版本

graph G
{
    splines = ortho;
    rankdir = LR;

    // node definitions
    node [ shape="box" fixedsize = true width = 4 height = 1];
    C
    { rank = same; B A }
    { rank = same; F D E }

    node [ shape="point" width = 0 height = 0 ];
    { rank = same; 
        B_Inv_Parent_1
        C_Inv_Even_Children_0
        A_Inv_Parent_1 }
    { rank = same;
        F_Inv_Parent_2
        D_Inv_Parent_2
        A_Inv_Even_Children_1
        E_Inv_Parent_2 }

    // edges
    C -- C_Inv_Even_Children_0;

    B_Inv_Parent_1 -- C_Inv_Even_Children_0 -- A_Inv_Parent_1;

    B_Inv_Parent_1 -- B -- F_Inv_Parent_2;
    A_Inv_Parent_1 -- A -- A_Inv_Even_Children_1;

    F_Inv_Parent_2 -- D_Inv_Parent_2  -- A_Inv_Even_Children_1 -- E_Inv_Parent_2;

    F_Inv_Parent_2 -- F;
    D_Inv_Parent_2 -- D;
    E_Inv_Parent_2 -- E;
}

和结果:

enter image description here

编辑:我可能误解了您的意图,您想如何连接第三级-如果是这样,请替换

F_Inv_Parent_2 -- D_Inv_Parent_2  -- A_Inv_Even_Children_1 -- E_Inv_Parent_2;

使用

F_Inv_Parent_2 -- D_Inv_Parent_2[ style = invis ];
D_Inv_Parent_2  -- A_Inv_Even_Children_1 -- E_Inv_Parent_2;

给你

enter image description here

编辑2号,以回应您的评论:

增加权重有助于使边缘变直-即使只有两行发生了更改(加上注释),我也会给出完整的代码,以便于复制和粘贴:

graph G
{
    splines = ortho;
    rankdir = LR;

    // node definitions
    node [ shape="box" fixedsize = true width = 4 height = 1];
    C
    { rank = same; B A }
    { rank = same; F D E }

    node [ shape="point" width = 0 height = 0 ];
    { rank = same; 
        B_Inv_Parent_1
        C_Inv_Even_Children_0
        A_Inv_Parent_1 }
    { rank = same;
        F_Inv_Parent_2
        D_Inv_Parent_2
        A_Inv_Even_Children_1
        E_Inv_Parent_2 }

    // edges
    C -- C_Inv_Even_Children_0;

    B_Inv_Parent_1 -- C_Inv_Even_Children_0 -- A_Inv_Parent_1;

    // add extra weight to the continouous connection between four levels:
    B_Inv_Parent_1 -- B -- F_Inv_Parent_2 -- F[ weight = 10 ];
    // no weight here:
    A_Inv_Parent_1 -- A -- A_Inv_Even_Children_1;

    F_Inv_Parent_2 -- D_Inv_Parent_2[ style = invis ];
    D_Inv_Parent_2  -- A_Inv_Even_Children_1 -- E_Inv_Parent_2;

    // F_Inv_Parent_2 -- F;  ### moved
    D_Inv_Parent_2 -- D;
    E_Inv_Parent_2 -- E;
}

哪条直线是从BF_Inv_Parent_2到实际上是孙子的F的直线:

enter image description here