【问题标题】:top-down subgraphs, left-right inside subgraphs自上而下的子图,从左到右的内子图
【发布时间】:2011-12-08 07:53:10
【问题描述】:

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

但我只能得到这个:

问题是,subgraph 中的rankdir does not work。 那么,如何模仿呢?

代码:

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]
}

【问题讨论】:

标签: graphviz subgraph


【解决方案1】:

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

  • 不可见的节点和边
  • 排名限制

这是我复制您的图表的方式 - 或者至少是其中的一部分:

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]
}

这个解决方案不是很直观。实现这一点的几点:

  • 我选择了rankdir="LR",它的边缘比TB 更好,尽管它与图形的方向并不完全一致
  • 不可见的节点和边用于排名靠前的节点(0、01、02),以使集群左对齐。
  • (不可见的)顶部节点被强制为相同的等级并由不可见的边链接 - 这将确保链接到每个节点的集群以正确的顺序出现。

结果是:

【讨论】:

  • @jason-s 感谢您的赏金!提交此答案多年后,真是出乎意料!
  • 算法好像变了。当我将您的解决方案粘贴到 viz.js 中时,我得到一个奇怪的 0C
  • 我可以使用group 修复它。看我的回答
【解决方案2】:

使用 constraint=false 应该让子图中的节点变成你想要的方式 http://www.graphviz.org/doc/info/attrs.html#d:constraint

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

之后你会发现你的子图并没有按照你想要的方式排列。像这样的东西可以解决这个问题。

"0A" -> "0B" -> "0C" -> "0D" -> "0E" [weight=999 style=invis];

【讨论】:

    【解决方案3】:

    rankdir 不能直接在子图中工作,但如果你添加另一组花括号 - 无论叫什么 - rankdir 都可以。见下文。然后,显然您需要更多技巧来恢复您所追求的对齐和排序。

    digraph G {
        node [shape = circle]
        0 [style = invis]
    
        0 -> "0A"
    
        subgraph clusterA {
            label=A
            {
                rank=same
                "0A"
                "1A"
                "2A" -> "0A" [label=•]
            }
        }
    
        subgraph clusterB {
            label=B
            {
                rank=same
                "0B"
                "1B"
                "2B" -> "0B" [label=•]
            }
        }
    
        subgraph clusterC {
            label=C
            {
                rank=same
                "0C"
                "1C"
                "2C" -> "0C" [label=•]
            }
        }
    
        subgraph clusterD {
            label=D
            {
                rank=same
                "0D"
                "1D"
                "2D" -> "0D" [label=•]
            }
        }
    
        subgraph clusterE {
            label=E
            {
                rank=same
                "0E"
                "1E"
                "2E" -> "0E" [label=•]
            }
        }
    
        subgraph clusterF {
            label=F
            {
                rank=same
                {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]
    }
    

    【讨论】:

    • 这很好用,而且比其他答案更容易阅读。
    • 你没有使用rankdir,是吗?看来您正在使用 rank=same 代替,这破坏了图表:集群中节点的顺序发生了变化。
    【解决方案4】:

    使用group 更新@marapet 的答案

    digraph g {
    rankdir="LR";
    node[shape = circle, fontsize=14];
    fontsize=18;
    labeljust="l";
    
    edge[style=invis, fontsize=12];
    
    { rank=same;
        0 [group=a style = invis];
        01 [style = invis];
        02 [group=b style=invis];
        0 -> 01 -> 02;
    }
    
    subgraph clusterA {
        "0A" [group=a]
        "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" [group=b]
        "1C" [group=b]
        "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]
    }
    

    【讨论】:

      【解决方案5】:

      看起来 rank=same 可能是更清洁的解决方案。看看Placing clusters on the same rank in Graphviz

      【讨论】:

        猜你喜欢
        • 2020-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-27
        • 2014-12-31
        • 2013-09-02
        • 2014-05-30
        相关资源
        最近更新 更多