GraphViz - 子图对齐

6

我希望能够画出像这样的图表。 desired

但是我只能画出这样的图表: current

我使用的代码:

graph [rankdir = LR]

node [shape=box]

x1;x2;x3;y1;y2;y3;y4;y5;y6;y7;y8;

node [shape=oval]

ind60;dem60;dem65

{x1,x2,x3} -> ind60[arrowhead=none arrowtail=normal dir=both]

{y1,y2,y3,y4} -> dem60[arrowhead=none arrowtail=normal dir=both]

dem65 -> {y5,y6,y7,y8}

ind60->dem60  dem60->dem65  ind60->dem65

我该如何绘制所需的图形?

1个回答

7
使用rank=same隐形边缘constraint=false是实现您想要达到的目标的第一步。
digraph {

node [shape=box]
{
    rank=same;
    y1;y2;y3;y4;
}

dem60[shape=oval];
{y1;y2;y3;y4} -> dem60 [dir=back];

{
    rank=same;
    x2 [group=left];
    ind60[shape=oval];
    dem65[shape=oval];
    y6 [group=right];

    x2 -> ind60 [dir=back];
    ind60 -> dem65
    dem65 -> y6;
}

// Invisible edges to order vertically node groups
edge[style=invis];
x1[group=left];
x3[group=left];
x1 -> x2 -> x3;
node[group=right];
y5 -> y6 -> y7 -> y8;

node[group=""]
edge[style=solid]
ind60->dem60
dem60->dem65

edge[constraint=false];
ind60 -> x1;
ind60 -> x3;
dem65 -> y5;
dem65 -> y7;
dem65 -> y8;
}
  • group 用于强制节点(同一组)的垂直对齐。
  • rank=same 使节点保持在同一层上。
  • 不可见的边强制在垂直组内保持等级顺序。
  • constraint=false 可以移除某些边的约束计算。
  • dir=back 可以反转显示的边的方向。

在这个上下文中,“rank”的意义是什么?我很难找到关于它的好文档。 - Josiah
Graphviz(点图)通过查看边缘来确定每个节点的等级,主要是确定其排名。没有入边的节点具有最低的排名,而具有入边的节点的排名比边另一端的节点高。 然后使用该等级进行布局 - 从低位(顶部)到高位(底部)。 rank = same修改自动排名算法,并告诉Graphviz在两个节点上使用相同的排名,因此在相同的垂直位置显示它们。 - marapet
谢谢!那对我很有帮助。 - Josiah

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