gpt4 book ai didi

graphviz:如何防止集群覆盖 rank=source 语句

转载 作者:行者123 更新时间:2023-12-01 04:11:40 25 4
gpt4 key购买 nike

enter image description here

以下代码生成上面的图表:

digraph G {


//---graph config

fontname=Helvetica

rankdir = RL
splines = polyline
compound = true
//concentrate = true

labeljust = c
labelloc = t

ranksep=0.5
nodesep=0.5

//size="10,10"
ratio=compress

edge [
minlen=1
arrowsize=0.75
labeldistance=5

fontname=Helvetica
fontsize=12
fontcolor=black

labelfontsize=12
labelfontcolor=red
labelfontname=Helvetica


]


node [
fontname=Helvetica
fontsize=12
fontcolor=black

regular=true
shape=diamond
// width=0.25
// height=0.25
]



// --- # nodes

{// records
node [shape=record, width=1]


b10 [label=" { R-7 | 5 } | B/10 "]
b20 [label=" { R-6 | 10 } | B/20 "]
b30 [label=" { R-5 | 10 } | B/30 "]
d10 [label=" { R-10 | 15 } | D/10 "]
d20 [label=" { R-9 | 10 } | D/20 "]
d30 [label=" { R-8 | 10 } | D/30 "]
a20 [label=" { R-2 | 5 } | A/20 "]
a30 [label=" { R-1 | 10 } | A/30 "]

}

{// circles
node [shape=circle]
e [label="E"]
c [label="C"]
}

{// box
node [shape=box]
a [label="A"]
}


//--- # edges

{
edge [weight = 1000]

//straight
c -> b10 -> b20 -> b30
e -> d10 -> d20 -> d30
a20 -> a30 -> a

//combination
{b30 d30} -> a20
}


//--- # Clusters

// subgraph cluster_1{
// label="a "
// e d10 d20
// }

// subgraph cluster_2{
// label="b "
// c b10 b20 b30
// }

// subgraph cluster_3{
// label="c "
// a30 a20
// }



// --- # bugfixes

{// c before e
edge [style=invis]
c -> e


{rank=source e c} // force same rank before other nodes
}



}

这正是我想要的那样漂亮和干净。
但是,我希望能够标记和评论结构的某些部分,我认为集群应该是做到这一点的正确方法。

如果您取消注释代码的 CLUSTERS 部分,您将获得以下代码和相应的图表:
digraph G {


//---graph config

fontname=Helvetica

rankdir = RL
splines = polyline
compound = true
//concentrate = true

labeljust = c
labelloc = t

ranksep=0.5
nodesep=0.5

//size="10,10"
ratio=compress

edge [
minlen=1
arrowsize=0.75
labeldistance=5

fontname=Helvetica
fontsize=12
fontcolor=black

labelfontsize=12
labelfontcolor=red
labelfontname=Helvetica


]


node [
fontname=Helvetica
fontsize=12
fontcolor=black

regular=true
shape=diamond
// width=0.25
// height=0.25
]



// --- # nodes

{// records
node [shape=record, width=1]


b10 [label=" { R-7 | 5 } | B/10 "]
b20 [label=" { R-6 | 10 } | B/20 "]
b30 [label=" { R-5 | 10 } | B/30 "]
d10 [label=" { R-10 | 15 } | D/10 "]
d20 [label=" { R-9 | 10 } | D/20 "]
d30 [label=" { R-8 | 10 } | D/30 "]
a20 [label=" { R-2 | 5 } | A/20 "]
a30 [label=" { R-1 | 10 } | A/30 "]

}

{// circles
node [shape=circle]
e [label="E"]
c [label="C"]
}

{// box
node [shape=box]
a [label="A"]
}


//--- # edges

{
edge [weight = 1000]

//straight
c -> b10 -> b20 -> b30
e -> d10 -> d20 -> d30
a20 -> a30 -> a

//combination
{b30 d30} -> a20
}


//--- # Clusters

subgraph cluster_1{
label="a "
e d10 d20
}

subgraph cluster_2{
label="b "
c b10 b20 b30
}

subgraph cluster_3{
label="c "
a30 a20
}



// --- # bugfixes

{// c before e
edge [style=invis]
c -> e


{rank=source e c} // force same rank before other nodes
}



}

enter image description here

正如您从代码末尾的错误修正部分所看到的,我希望节点 C 和 E 肯定以相同的等级出现在“高于”所有其他节点的位置。

此外,我希望记录的上下序列与第一个示例中的漂亮直线连接。我介绍的边缘的重量无济于事。

有谁知道如何解决这个问题,以及如何让 graphviz 生成一个漂亮干净的图形,如示例 #1 中那样,只添加了 3 个拥抱框和相应的标签?

最佳答案

我试图只修改需要的内容:

  • 添加了一个没有标签的额外集群和 style=invis (适用于 d30)
  • 将节点的顺序更改为将集群 b 置于集群 a 之上
  • 去除边缘重量
  • 错误修正部分已删除
  • 删除了一些换行符

  • 这是我使用最近的 graphviz 版本 (2.29) 得到的结果:

    enter image description here

    不完美,但更接近。
    digraph G {
    //---graph config

    fontname=Helvetica

    rankdir = RL
    splines = polyline
    compound = true
    //concentrate = true

    labeljust = c
    labelloc = t

    ranksep=0.5
    nodesep=0.5

    //size="10,10"
    ratio=compress

    edge [
    minlen=1
    arrowsize=0.75
    labeldistance=5

    fontname=Helvetica
    fontsize=12
    fontcolor=black

    labelfontsize=12
    labelfontcolor=red
    labelfontname=Helvetica
    ]

    node [
    fontname=Helvetica
    fontsize=12
    fontcolor=black

    regular=true
    shape=diamond
    // width=0.25
    // height=0.25
    ]

    // --- # nodes

    {// records
    node [shape=record, width=1]

    d10 [label=" { R-10 | 15 } | D/10 "]
    d20 [label=" { R-9 | 10 } | D/20 "]
    d30 [label=" { R-8 | 10 } | D/30 "]
    b10 [label=" { R-7 | 5 } | B/10 "]
    b20 [label=" { R-6 | 10 } | B/20 "]
    b30 [label=" { R-5 | 10 } | B/30 "]
    a20 [label=" { R-2 | 5 } | A/20 "]
    a30 [label=" { R-1 | 10 } | A/30 "]
    }

    {// circles
    node [shape=circle]
    e [label="E"]
    c [label="C"]
    }

    {// box
    node [shape=box]
    a [label="A"]
    }

    //--- # edges

    {

    //straight
    c -> b10 -> b20 -> b30
    e -> d10 -> d20 -> d30
    a20 -> a30 -> a

    //combination
    {b30 d30} -> a20}

    //--- # Clusters


    subgraph cluster_1{
    label="a "
    e d10 d20
    }

    subgraph cluster_2{
    label="b "
    c b10 b20 b30
    }

    subgraph cluster_3{
    label="c "
    a30 a20
    }

    subgraph cluster_4{
    label=""
    style=invis
    d30
    }

    }

    关于graphviz:如何防止集群覆盖 rank=source 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5750459/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com