在Graphviz中对齐子图、排序节点和重新定位边
我正在尝试绘制一个GraphViz图(使用版本在Graphviz中对齐子图、排序节点和重新定位边,graphviz,dot,Graphviz,Dot,我正在尝试绘制一个GraphViz图(使用版本2.38.0(20140413.2041)),但很难按照我想要的方式进行布局。我尝试过隐藏边、约束操作、子图(集群和非集群)等多种不同的组合,但似乎没有任何效果 以下是我当前的代码: digraph G { subgraph clustera { style=invis;rank=same A->B->C } subgraph clusterb { style=invis;rank=same;rank
2.38.0(20140413.2041)
),但很难按照我想要的方式进行布局。我尝试过隐藏边、约束操作、子图(集群和非集群)等多种不同的组合,但似乎没有任何效果
以下是我当前的代码:
digraph G {
subgraph clustera {
style=invis;rank=same
A->B->C
}
subgraph clusterb {
style=invis;rank=same;rankdir=LR
D->E [constraint=false]
}
subgraph clusterc {
style=invis;rank=same
F->G [constraint=false]
}
C -> D
D -> F [constraint=false]
E -> C
F -> A [constraint=false]
F -> C [constraint=false]
F -> E [constraint=false]
}
下面是使用dot-Tpng的渲染方式:
(所有的F
边都关闭了“约束”,因为几乎所有其他的东西都会严重扭曲图形。)
我想要的是:
- 节点
F
上方节点G
F
和G
在图形上大致垂直居中
F
和G
到E
A
到E
大致按照他们现在的安排
- 从
F
到A
、C
和E
的边缘,以及从D
到F
的边缘,大致沿直线(即不绕F
/G
组的右侧布线)
- 作为奖励,我想通过
C
让a
正确地位于d
和E
之上,但这并不重要
(我非常不希望F
出现在A
上方,就好像它是图形的根一样。)
以下是我正在寻找的一个近似值,用手工绘制:
这在GraphViz可行吗
(我应该注意,我非常愿意使用其他GraphViz工具之一,只是,dot
是我唯一熟悉的工具。)只需要一个集群来保持ABCDE组的一致性。向后的方向箭头和权重帮助很大
digraph g
{
subgraph cluster_subCDE {
color=invis;
A; B; C; D; E;
}
A->B [weight=10];
A->F [dir=back];
B->C [weight=10];
F->C;
C->E [color=invis];
C->D;
D->E [constraint=false];
E->C;
F->G [weight=10];
F->D [dir=back];
F->E;
}
我的方法没有子图
和权重
s,只有组
s垂直对齐节点,以及约束=false
以及dir=back
保留布局扭曲
digraph G {
// nodes without a group
D;
E;
// group left side
node[group=left];
A -> B -> C -> D;
C -> E [dir=back];
D -> E [constraint=false];
// group right side
node[group=right];
F -> G;
// inter group edges
F -> C;
edge [constraint=false];
D -> F;
F -> A;
F -> E;
}
和对应于您的近似值。稍微自由地解释您的需求,您可能会有一个没有边交叉的图形
digraph G { rankdir = LR ranksep = 1.2 nodesep = 0.5
{ rank=same A -> B -> C -> D -> E }
D -> F
{ rank=same F -> G }
edge [constraint=false]
E -> C
F -> A
F -> C
F -> E
}
G
A.
A.
B
B
A-B
C
C
B-C
D
D
C-D
E
E
D-E
F
F
D-F
电子商务
F-A
F-C
F-E
G
G
F-G
不错!我不知道组
。只有,有一种方法可以交换D/E?@要交换D和E,只需更改第一次提到这些节点的顺序(交换图形的前两行并在D之前提到E)。@marapet。。。我没有意识到第一次提及和流动(并用dir=back和constraint=false控制它们)的效果!将这两行s“C->E[dir=back];”和“D->E[constraint=false]”切换到“E->C;”就可以比较这个图了,这真是太神奇了!和“D->E”!