与其他节点排列相同的graphviz集群

3
我正在尝试创建一个图表,明确指定许多节点的等级并指定集群。以下代码生成了我想要的类型的图表:
digraph {
    rankdir=LR
    subgraph cluster0 {
        "MATH 208"
        "MATH 211"
        graph [rankdir=LR, style="rounded,filled", color=gray]
    }
    subgraph year1 {
        subgraph {
            "MATH 100"
            "MATH 110"
            graph [rankdir=LR, rank=same]
        }
        subgraph {
            "MATH 101"
            "MATH 211"
            "MATH 208"
            graph [rankdir=LR, rank=same]
        }
        graph [rankdir=LR]
    }
    subgraph year2 {
        subgraph {
            "MATH 205"
            "PHIL 203"
            graph [rankdir=LR, rank=same]
        }
        graph [rankdir=LR]
    }
    subgraph year3 {
        subgraph {
            "MATH 311"
            "MATH 312"
            "MATH 375"
            graph [rankdir=LR, rank=same]
        }
        graph [rankdir=LR]
    }
    subgraph year4 {
        subgraph {
            "MATH 447"
            "MATH 412"
            graph [rankdir=LR, rank=same]
        }
        graph [rankdir=LR]
    }
    "MATH 100" -> "MATH 101"
    "MATH 100" -> "MATH 208"
    "MATH 101" -> "MATH 205"
    "MATH 110" -> "MATH 311"
    "MATH 211" -> "MATH 311"
    "MATH 110" -> "MATH 312"
    "MATH 211" -> "MATH 312"
    "PHIL 203" -> "MATH 375"
    "MATH 110" -> "MATH 447"
    "MATH 211" -> "MATH 447"
    "MATH 311" -> "MATH 412"
    "MATH 312" -> "MATH 412"
}

这会生成一张正确的图表,其中"MATH 211"与"MATH 101"处于同一级别,然而graphviz会发出警告。
Warning: MATH 208 was already in a rankset, ignored in cluster pruned
Warning: MATH 211 was already in a rankset, ignored in cluster pruned

如果我从year1子图中删除“MATH 211”和“MATH 208”,Graphviz就不再抱怨,但是生成的图形与“MATH 101”在同一等级的簇不再具有相同的等级(为什么会这样...):
是否有任何方法可以重新排列/重新排序我的dot文件以产生第一个图形,但没有任何警告?或者指定某个群集应该位于另一个节点的同一等级?
我应该注意到,此图使用Graphviz 2.26成功编译,但是在Graphviz 2.28上失败...
1个回答

1

几个想法

  • 我认为子图需要以“cluster”开头的名称才能获得任何样式。实际上,如果没有集群前缀,它们可能根本不起作用,这可能是您问题的根源。
  • 您不需要重复rankdir=LR。在顶部指定一次应该足够了。
  • 如果子图中没有节点彼此依赖,则它们很有可能已经在同一等级中,并且不需要rank=same。

这是对我有效的一个版本:

    digraph {
    rankdir=LR
    subgraph cluster0 {
        "MATH 208"
        "MATH 211"
        graph [style="rounded,filled", color=gray]
    }
    subgraph clusteryear1 {
        subgraph cluster100{
            "MATH 100"
            "MATH 110"
            graph [rank=same]
        }
        subgraph cluster101{
            "MATH 101"
            "MATH 211"
            "MATH 208"
            graph [rank=same]
        }
    }
    subgraph clusteryear2 {
        subgraph cluster205{
            "MATH 205"
            "PHIL 203"
            graph [rank=same]
        }
    }
    subgraph clusteryear3 {
        subgraph cluster311{
            "MATH 311"
            "MATH 312"
            "MATH 375"
            graph [rank=same]
        }
    }
    subgraph clusteryear4 {
        subgraph cluster447 {
            "MATH 447"
            "MATH 412"
            graph [rank=same]
        }
    }
    "MATH 100" -> "MATH 101"
    "MATH 100" -> "MATH 208"
    "MATH 101" -> "MATH 205"
    "MATH 110" -> "MATH 311"
    "MATH 211" -> "MATH 311"
    "MATH 110" -> "MATH 312"
    "MATH 211" -> "MATH 312"
    "PHIL 203" -> "MATH 375"
    "MATH 110" -> "MATH 447"
    "MATH 211" -> "MATH 447"
    "MATH 311" -> "MATH 412"
    "MATH 312" -> "MATH 412"
}

你关于集群的理解是正确的,不需要为每个子图指定rankdir,但我实际上只想要一个有名称cluster0的单独子图被设置样式,而不是所有的子图都被设置。 (我会发一张图片来说明我的意思,但我还没有modpoints)。在你的解决方案中,彩色的集群出现在“MATH 205”列中,而不是像我想要的那样出现在“MATH 101”列中。 - Jason Siefken

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