2011-04-21 48 views
4

enter image description here的graphviz:如何防止集群从overrinding排名= source语句

下面的代码产生上图:

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 
} 



} 

这是完全一样的漂亮,干净,我希望它是。 但是,我希望能够对结构的某些部分进行标记和评论,并且我认为集群应该是正确的方法。

如果您取消注释你得到下面的代码和相应的图形代码的集群部分:

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肯定会出现在所有其他节点“上方”的同一等级上。

Furhtermore,我想记录的上部和下部序列与第一个例子中的直线相连。我介绍的边缘的重量不起作用。

有没有人知道如何解决这个问题,以及如何使graphviz产生一个很好的干净的图,如只有3个拥抱框和相应的标签添加示例#1?

回答

2

我试图只修改需要什么:

  • 添加不含标签和style=invis(对于D30)其他群集
  • 改变了节点的顺序为具有簇上面的b集群
  • 边缘weigth删除
  • 错误修正部分去掉
  • 一些换行符删除

这就是我得到一个最新的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 
} 

} 
+0

这正是我正在寻找的解决方案。适合我!谢谢!我会仔细看看你的修复。大! – user522315 2011-05-19 09:27:43

+0

是否有某个规则告诉我为什么要在其他人之前定义D节点,尽管我希望它们出现在图的底部?还是你只是在定义之前洗牌? – user522315 2011-05-19 18:53:10

+0

通常,除了布局需要优化之外,相同级别上的节点按照它们定义的顺序出现。使用'digraph {a; b - > {c; d;}; e;}'来玩:移除e,a放在左边;删除一个,e被放置正确;切换顺序为c和d,并切换位置。当您更改rankdir时,所有内容都会随着rankdir而改变。更复杂的图形通常无法预测,然后在使用某些选项或形状(记录)时存在一个或另一个错误和限制。所以它不是简单地在节点周围洗牌,但我总是需要视觉确认来确保;-) – marapet 2011-05-19 19:37:01