自上而下的子图,左右内的子图

Pit*_*tel 29 graphviz subgraph

我想让我的图表看起来像这样:

但我只能得到这个:

问题是,rankdir 不工作subgraph.那么,如何模仿呢?

代码:

digraph G {
    node [shape = circle]
    0 [style = invis]

    0 -> "0A"

    subgraph clusterA {
        label=A
        "0A"
        "1A"
        "2A" -> "0A" [label=•]
    }

    subgraph clusterB {
        label=B
        "0B"
        "1B"
        "2B" -> "0B" [label=•]
    }

        subgraph clusterC {
        label=C
        "0C"
        "1C"
        "2C" -> "0C" [label=•]
    }

    subgraph clusterD {
        label=D
        "0D"
        "1D"
        "2D" -> "0D" [label=•]
    }

    subgraph clusterE {
        label=E
        "0E"
        "1E"
        "2E" -> "0E" [label=•]
    }

    subgraph clusterF {
        label=F
            {node [shape = doublecircle] "0F" "1F"}
        "2F" -> "0F" [label=•]
    }

    "0A" -> "1B" [label=a]
    "1A" -> "2B" [label=a]
    "0B" -> "1C" [label=b]
    "1B" -> "2C" [label=b]
    "0C" -> "1D" [label=c]
    "1C" -> "2D" [label=c]
    "0D" -> "1E" [label=d]
    "1D" -> "2E" [label=d]
    "0E" -> "1F" [label=e]
    "1E" -> "2F" [label=e]
}
Run Code Online (Sandbox Code Playgroud)

mar*_*pet 47

通常可以通过以下方式重现特定的图形布局:

  • 不可见的节点和边缘
  • 等级约束

这是我如何复制你的图表 - 或者至少是它的一部分:

digraph g {
    rankdir="LR";
    node[shape = circle, fontsize=14];
    fontsize=18;
    labeljust="l";

    edge[style=invis, fontsize=12];

    { rank=same;
        0 [style = invis];
        01 [style = invis];
        02 [style=invis];
        0 -> 01 -> 02;
    }

    subgraph clusterA {
        "0A" -> "1A" -> "2A";
        "2A" -> "0A" [label=".", constraint=false, style=solid];
        label="A";
    }

    subgraph clusterB {
        "0B" -> "1B" -> "2B";
        "2B" -> "0B" [label=".", constraint=false, style=solid];
        label="B";
    }

    subgraph clusterC {
        "0C" -> "1C" -> "2C";
        "2C" -> "0C" [label=".", constraint=false, style=solid];
        label="C";
    }

    0 -> "0A"[style=solid];
    01 -> "0B"[style=invis];
    02 -> "0C"[style=invis];

    // edges between clusters
    edge[constraint=false, style=solid];
    "0A" -> "1B" [label=a]
    "1A" -> "2B" [label=a]
    "0B" -> "1C" [label=b]
    "1B" -> "2C" [label=b]
}
Run Code Online (Sandbox Code Playgroud)

这个解决方案不是很直观.有几点要做到这一点:

  • 我选择rankdir="LR"哪个产生了更好的边缘TB,但它并没有真正与图形的方向相对应
  • 不可见节点和边缘用于顶级节点(0,01,02),以使簇对齐.
  • (不可见的)顶级节点被强制为相同的排名并通过不可见边链接 - 这将确保链接到每个节点的集群以正确的顺序出现.

结果是:

graphviz输出


Tho*_*eld 6

看起来rank=same可能是一个更干净的解决方案。查看Graphviz 中的将集群置于同一等级上

您还可以使用“constraint=false”和不可见边来仔细控制节点等级。这与上面的答案基本相同。

digraph G {
    newrank=true; // rank without respect to cluster
    rankdir="LR"; 
    node [shape = circle]
    
    subgraph clusterA {
        a0 -> a1 -> a2 [style = invis] // set node order in cluster
        a2 -> a0 [constraint=false] //don't use this edge for ranking
    }

    subgraph clusterB {
        b0 -> b1 -> b2 [style = invis]
        b2 -> b0  [constraint=false]
    }
    
    a0 -> b1 [constraint=false]
    a1 -> b2 [constraint=false]
    
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述