Graphviz中集群之间的直线边界

31

我正在尝试在Graphviz中让聚类之间有一条边,但是该边不影响排名。

这看起来很好:

digraph {
  subgraph clusterX {
    A    
    B
  }

  subgraph clusterY {
    C
    D
  } 

  A -> B
  B -> C [constraint=false]
  C -> D
}

但是,当我给 C -> D 边添加标签后,B -> C 边会试图规避该标签(看起来很丑陋)。

digraph {
  subgraph clusterX {
    A    
    B
  }

  subgraph clusterY {
    C
    D
  } 

  A -> B
  B -> C [constraint=false]
  C -> D [label=yadda]
}

您有什么办法可以使从BC的边保持直线吗?

3个回答

50

最简单的方法是在dot文件中添加splines=false - 这将强制边缘渲染为直线:

digraph {
 splines=false;
 subgraph clusterX {
    A;
    B;
 }

 subgraph clusterY {
    C;
    D;
 } 

 A -> B;
 B -> C [constraint=false];
 C -> D [label=yadda];
}

输出:

graphviz输出


2
我得到的边缘不是直接从第一个节点到第二个节点,而是仍然弯曲,但是折射了,而不是平滑的 :/ - Youda008

3
您可以使用此版本:
digraph G { 
  subgraph cluster_X {
    A [ pos = "0,1!" ]; 
    B [ pos = "0,0!" ];
  } 
  subgraph cluster_Y {
    C [ pos = "1,1!" ]; 
    D [ pos = "1,0!" ];
  } 
  A -> B
  B -> C[label="yadda"]
  C -> D;
}

然后您需要使用neato(而不是dot)。
neato -Tpng -oyadda.png yadda.dot

结果如下:

结果是:

enter image description here


使用neato后,我不再得到集群框了。对吗? - towi
1
@towi,是的。引用:“我们应该生成一个警告。fdp有集群并使用不同的算法进行类似的布局。” - kirogasa

1

除了使用

  • Result with xlabel:
    label on an edge made with graphviz dot
    Script:

    digraph {
        subgraph clusterX { A B }
        subgraph clusterY { C D } 
        A -> B
        B -> C [constraint=false]
        C -> D [xlabel=yadda]
    }
    
  • Result with headlabel:
    label on an edge made with graphviz dot
    Script:

    digraph {
        subgraph clusterX { A B }
        subgraph clusterY { C D } 
        A -> B
        B -> C [constraint=false]
        C -> D [headlabel=yadda]
    }
    
  • Result with taillabel:
    label on an edge made with graphviz dot
    Script:

    digraph {
        subgraph clusterX { A B }
        subgraph clusterY { C D } 
        A -> B
        B -> C [constraint=false]
        C -> D [taillabel=yadda]
    }
    

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