fdp / graphviz:即使在强制位置的情况下,行开头的垂直未对齐

时间:2019-04-04 23:38:54

标签: graphviz

我正在探索使用fdp使用带有强制位置的fdp进行基于网格(行和列)的图表。但是令我惊讶的是,有时强迫职位仍然只是建议,并不是真正执行。我想知道如何用graphviz,一些布局引擎和一些参数组合来完全实施位置吗?

以下是我的发现的例证: (我正在使用emacs / org-mode / graphviz代码块生成图)

案例1:单列,完美对齐:

#+begin_src dot :file ./column1.png :cmdline -Kfdp -Tpng
graph dfd {
node[shape=box]
"(0.0, 0.0)" [pos="0.0, 0.0!"]
"(0.0, 0.1)" [pos="0.0, 0.1!"]
"(0.0, 0.2)" [pos="0.0, 0.2!"]
"(0.0, 0.3)" [pos="0.0, 0.3!"]
}
#+end_src

结果: enter image description here

案例2:2列:甚至第一列也不再对齐

#+begin_src dot :file ./column2.png :cmdline -Kfdp -Tpng
graph dfd {
node[shape=box]
"(0.0, 0.0)" [pos="0.0, 0.0!"]; "(0.1, 0.0)" [pos="0.1, 0.0!"]
"(0.0, 0.1)" [pos="0.0, 0.1!"]; "(0.1, 0.1)" [pos="0.1, 0.1!"]
"(0.0, 0.2)" [pos="0.0, 0.2!"]; "(0.1, 0.2)" [pos="0.1, 0.2!"]
"(0.0, 0.3)" [pos="0.0, 0.3!"]; "(0.1, 0.3)" [pos="0.1, 0.3!"]
}
#+end_src

结果: enter image description here

我还发现,列越多,错位越严重。我发现fdp的布局算法在某种程度上具有弹性,可以避免重叠,但是对于第一列,我还是不了解,应该没有重叠。

1 个答案:

答案 0 :(得分:2)

好吧,我不确定graphviz是否真的是您想要实现的目标的选择工具。但是,由于我不知道,这里有一些内容可以帮助您前进:

dot以层次结构的方式排列您定义的节点,这取决于定义它们的顺序,边缘的方向以及针对同一层次结构的节点的特定指令rank = same水平。 dot根据标签自动设置节点的宽度和高度,因此,如果标签的长度不同,则需要考虑这一点。

一个非常基本的示例:

digraph so 
{
    // default/initial node style
    node[ shape = box, width = 2, height = 1.5 ];
    // default/initial edge style
    edge[ style = invis ];

    {rank = same; a1 -> a2 -> a3 -> a4 }
    {rank = same; b1 -> b2 -> b3 -> b4 }
    {rank = same; c1 -> c2 -> c3 -> c4 }
    {rank = same; d1 -> d2 -> d3 -> d4 }
    a1 -> b1 -> c1 -> d1;  

    a1[ label = "bla" ];
    c1[ label = "long label\nwith new line" ];

}

给你

enter image description here

在这个简单的示例中,rank = same指令并不是必需的,您可以使用

a1 -> b1 -> c1 -> d1;
a2 -> b2 -> c2 -> d2;
a3 -> b3 -> c3 -> d3;
a4 -> b4 -> c4 -> d4;

但是您的结构越详细,明确排名将越有帮助。