GraphViz节点定位和Rankdir

46

我在使用Graphviz方面非常顺利,几乎可以做出我需要的每个图形。我试图尽可能地复制这个图形:

http://en.wikipedia.org/wiki/File:ICS_Structure.PNG

那张图的底部都是自上而下的流程,我已经成功实现了。但我无法把前三个子节点放在"Incident Commander"正下方。它们左右分支。另外请注意前8个节点中共享的边缘。在dot中是否可能实现这一点?除了这些顶部节点之外,其他的我都能处理好。有人能给我一点线索来解决这个问题吗?

2个回答

133

有两种有用的技术可用于复制图形布局:

  • 隐形节点
  • 等级约束

这是对顶部节点的快速尝试:

digraph g{
ranksep=0.2;

node[shape=box3d, width=2.3, height=0.6, fontname="Arial"];
n1[label="Incident Commander"];
n2[label="Public Information\nOfficer"];
n3[label="Liaison Officer"];
n4[label="Safety Officer"];
n5[label="Operations Section"];
n6[label="Planning Section"];
n7[label="Logistics Section"];
n8[label="Finance/Admin. Section"];

node[shape=none, width=0, height=0, label=""];
edge[dir=none];
n1 -> p1 -> p2 -> p3;
{rank=same; n2 -> p1 -> n3;}
{rank=same; n4 -> p2;}
{rank=same; p4 -> p5 -> p3 -> p6 -> p7;}
p4 -> n5;
p5 -> n6;
p6 -> n7;
p7 -> n8;
}

以下是结果:

dot layout top nodes


2
很高兴能帮到你!(由于这是您的第一个问题:如果这正是您想要的,请不要忘记点赞/接受答案。)之所以您找不到太多像这样的布局,是因为Graphviz并不是创建此类图表的理想工具——如果您需要对布局有100%的控制权,一些所见即所得的程序可能更容易使用。 - marapet
6
p1,p2,p3等变量的定义在哪里?我有遗漏吗? - HeyWatchThis
10
不需要显式定义每个节点 - 节点在第一次出现时被定义。你可以看到,我首先定义了可见节点,然后为此后将定义的所有节点设置默认节点属性(node[shape=none, ...])。由于所有的 p 节点出现在该行之后,它们都具有 shape=none 属性。 - marapet
好的,很酷。我以为这可能是一种特殊的点节点点语法,就像它们用于以“cluster”开头的群集一样。但是,嗯,这是一种强制实现所需布局的聪明方式,很酷。 - HeyWatchThis
@marapet,隐形附加节点不是一种丑陋的黑客技巧吗? - Pacerier
@Pacerier 是的,我同意,这就是为什么我在之前的评论中说graphviz不是重新创建现有布局最合适的工具。但是如果有人想要这样做,这是我知道的一种允许这样做的方法(大多数情况下'splines=ortho'是不够的)。如果您知道更好或替代的技术,请发布它们,我会点赞的。 - marapet

-3

原生的Graphviz(dot)渲染不支持原始文件中使用的组织图渲染样式。虽然它可以生成正交边缘(如所示),但无法自动分组边缘。垂直分层可以通过minlen实现。

接受的答案在符号表示上有些滥用,但总体上是一个合理的方法。它可能很难自动化,建议使用WYSIWIG替代方案最简单。

poor ICS rendering

提供的解决方案的更改如下:
graph [splines=ortho]; edge [dir = none];

{ rank = same; n2; n3; }
n1 -> { n2; n3; };
n1 -> n4 [minlen = 2];
{ rank = same; n5; n6; n7; n8; };
n1 -> { n5; n6; n7; n8; } [minlen = 3];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接