Graphviz中的集群赢得';对称t空间
我试图让多个节点集群在Graphviz中均匀分布 我认为这张图片最好地解释了我要做的事情: 从图中可以看到,第2层和第3层之间有额外的间距。2和3之间的间距应与1和2之间的间距相同 间距也需要缩放到3层以上。当我尝试3层以上时,第4层的间距与第3层的间距相同 这是我的图形文件:Graphviz中的集群赢得';对称t空间,graphviz,dot,Graphviz,Dot,我试图让多个节点集群在Graphviz中均匀分布 我认为这张图片最好地解释了我要做的事情: 从图中可以看到,第2层和第3层之间有额外的间距。2和3之间的间距应与1和2之间的间距相同 间距也需要缩放到3层以上。当我尝试3层以上时,第4层的间距与第3层的间距相同 这是我的图形文件: digraph G { nodesep=1.25; splines=false; node[width=1, shape=circle]; edge[style=invis];
digraph G {
nodesep=1.25;
splines=false;
node[width=1, shape=circle];
edge[style=invis];
subgraph cluster_1 {
label="Layer 1";
"1-1" -> "1-2" -> "1-3";
}
subgraph cluster_2 {
label="Layer 2";
"2-1" -> "2-2" -> "2-3";
}
subgraph cluster_3 {
label="Layer 3";
"3-1" -> "3-2" -> "3-3";
}
edge[style=solid, penwidth=1, constraint=false];
"1-1" -> "2-1";
"1-3" -> "2-1";
"1-1" -> "2-2";
"1-2" -> "2-2";
"1-2" -> "2-3";
"1-3" -> "2-3";
"2-1" -> "3-1";
"2-3" -> "3-1";
"2-1" -> "3-2";
"2-2" -> "3-2";
"2-2" -> "3-3";
"2-3" -> "3-3";
}
我怎样才能使我的间隔对称?任何帮助都将不胜感激。谢谢
更新:
我已经设法使间距均匀,但这不是一个完美的解决方案
通过在图形上方放置一个具有不可见边的不可见节点,并将其连接到每个层中的顶部节点,层之间的间距均匀。但是,此节点会将需要添加到所示图像上方的内容的间距弄乱。那么,有更好的方法吗?添加外部集群
为清晰起见,显示了外部簇的边界框
将群集cluster_1
、cluster_2
和cluster_3
嵌套在另一个群集中会使布局引擎将它们均匀地隔开
使用布局引擎
但是,从下到上的rankdir
将从左到右的显示顺序反转为(cluster_3、cluster_2、cluster_1)
。颠倒源文件中的顺序可以修复[kludges over]
工作代码
笔记
新的外部集群可以设置样式,使其边界框不可见。我认为您在布局引擎中发现了一个bug。额外的空间出现在带有样条线的边
“x-3”->“y-1”
将围绕节点“y-2”
@stefan进行布线的位置,没有容器,布局引擎没有理由认为相等的间距很重要(这并不是说它不应该被编程为这样做)。将集群嵌套在另一个集群中会导致布局引擎将它们平均隔开。请参阅下面我的答案中的代码。@benrudgers:有或没有“容器”(container)的推理(没有)是相同的。等间距只是偶然的,外部星团中的大空白确实清楚地表明了确定内部图形大小的问题。另请参阅我对下面答案的评论。首先,外部集群会拉伸图形大小,这是不必要的行为。第二,在一个集群中,集群绝对没有排序。您的示例给出了我的计算机上群集的随机顺序(win7 64位;gv 2.38.0)。结果是123像你的图像一样,321有两个大的间距,甚至是一个粗大的231。@stefan像你的问题一样,图形的大小是默认值。本手册描述了如何控制该行为。这次我让你自己读。不客气,我没问任何问题。我确实指出了为什么我认为你的解决方案不是解决方案。首先,外部集群会拉伸图形大小。我说的不是可见性,而是以像素为单位恢复图像。如果我过度阅读了一个解决方案,我会很高兴你能将我和OP指向手册中的要点,并为OP和所有其他读者发布一个可复制的解决方案。第二,你的“解决方案”确实表现出随机行为。请检查一下。除非这是一个针对我的版本2.33.0的bug,否则我认为你的解决方案是错误的,请你重新绘制你的答案。我的解决方案是解决问题中最简单的方法。它在LinuxUbuntu15.04上工作稳定。应向开发人员报告Windows的问题。如果问题是像素,请尝试输出到SVG。文件可通过Graphviz网站获取。我很抱歉把你的问题与问题中提出的问题混淆了。
digraph G {
nodesep=1.25;
splines=false;
clusterrank=local;
node[width=1, shape=circle];
edge[style=invis];
subgraph cluster_0 {
subgraph cluster_3 {
label="Layer 3";
"3-1" -> "3-2" -> "3-3";
}
subgraph cluster_2 {
label="Layer 2";
"2-1" -> "2-2" -> "2-3";
}
subgraph cluster_1 {
label="Layer 1";
"1-1" -> "1-2" -> "1-3";
}
}
edge[style=solid, penwidth=1, constraint=false];
"1-1" -> "2-1";
"1-3" -> "2-1";
"1-1" -> "2-2";
"1-2" -> "2-2";
"1-2" -> "2-3";
"1-3" -> "2-3";
"2-1" -> {"3-1" "3-2"};
"2-3" -> {"3-1" "3-3"};
"2-2" -> {"3-2" "3-3"};
}