fdp/graphviz:即使在强制位置,行开始处的垂直偏差

fdp/graphviz:即使在强制位置,行开始处的垂直偏差,graphviz,Graphviz,我正在探索使用fdp做基于网格(行和列)的图表,使用fdp和强制位置。但令我惊讶的是,强制立场有时仍然只是建议,而不是真正的强制执行。我想知道如何使用graphviz、一些布局引擎和一些参数组合来完全执行这些位置 以下是我的调查结果的说明: (我正在使用emacs/org mode/graphviz代码块生成图表) 案例1:单列,完美对齐: #+begin_src dot :file ./column1.png :cmdline -Kfdp -Tpng graph dfd { node[shap

我正在探索使用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
结果:

案例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
结果:


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

嗯,我不确定
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" ];

}
这给了你

在这个简单的例子中,
rank=same
指令实际上是不必要的,您可以使用

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

但是你的结构越复杂,明确的排名就越有帮助。

好吧,我不确定
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" ];

}
这给了你

在这个简单的例子中,
rank=same
指令实际上是不必要的,您可以使用

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

但是你的结构越复杂,明确的排名就越有帮助。

Wht
fdp
,而不是
dot
?fdp使用“spring”模型绘制无向图。它基于Fruchterman和Reingold精神的力量导向方法(参见软件实践与经验21(11),1991,第1129-1164页)。对不起,我对dot和sdp了解不够。这就是我能想到的。请分享您是如何通过dot/graphviz实现垂直/水平对齐的。Wht
fdp
,而不是
dot
?fdp使用“spring”模型绘制无向图。它基于Fruchterman和Reingold精神的力量导向方法(参见软件实践与经验21(11),1991,第1129-1164页)。对不起,我对dot和sdp了解不够。这就是我能想到的。请分享你是如何通过点/图实现垂直/水平对齐的。使用Invi、rank、垂直序列的绝佳说明!谢谢使用Invi、rank、垂直序列的绝佳说明!谢谢