Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
graphviz:如何防止集群过度使用rank=source语句_Graph_Graphviz_Rank - Fatal编程技术网

graphviz:如何防止集群过度使用rank=source语句

graphviz:如何防止集群过度使用rank=source语句,graph,graphviz,rank,Graph,Graphviz,Rank,以下代码生成上面的图形: 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" ra

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

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
}



}

正如您在代码末尾的bugfixes部分中所看到的,我希望节点C和E在所有其他节点的“上方”出现时具有相同的级别

此外,我希望记录的上下序列与第一个示例中的直线相连接。我介绍的边的权重没有帮助


是否有人知道如何解决此问题,以及如何使graphviz生成一个漂亮干净的图形,如示例#1所示,只添加了3个包围盒和相应的标签?

我尝试只修改所需的内容:

  • 添加了一个不带标签和
    style=invi
    的附加群集(适用于d30)
  • 更改了节点的顺序,使群集b位于群集a之上
  • 去除边缘重量
  • 错误修复部分已删除
  • 删除了一些换行符
以下是我从最近的graphviz版本(2.29)中得到的信息:

不完美,但更接近

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
 }

}

这正是我一直在寻找的解决方案。非常适合我!谢谢我会仔细看看你的修复方案。伟大的是否有某种规则告诉我为什么我要在其他节点之前定义D节点,尽管我希望它们出现在图表的底部?或者你只是简单地洗牌定义直到它起作用?通常,同一列上的节点按定义的顺序出现,除非布局需要优化。玩
有向图{a;b->{c;d;};e;}
:去掉e,a放在左边;取下a,e放在右边;切换c和d的顺序,并切换位置。当你改变rankdir时,一切都会随着rankdir而改变。更复杂的图形通常无法预测,然后在使用某些选项或形状(记录)时会出现一个或另一个错误和限制。因此,它不是简单地在节点周围移动,而是我始终需要视觉确认来确保;-)