3

我需要绘制一个二分图。它有大约 500 个节点。

目前我正在尝试用graphviz来做。该图有两种类型的节点。我希望第一种类型位于左侧,而另一个节点位于绘图的右侧。如果我用它做简单的绘图,dot那么它就是两行节点的窄条。这些行彼此太靠近,因此很难识别节点之间的任何单独边。我尝试了其他布局算法,例如circo. 我喜欢节点在一个圆圈上,但我不知道如何分割左右半圆上的节点。

我想要的完美输出是下一个:节点沿着一个圆圈分布,但两种类型的节点属于不同的半圆。我有办法使用图表来做到这一点吗?

如果在graphviz中太难做,你会推荐一个更好的工具吗?

4

1 回答 1

3

dot您可以在使用该ranksep属性时增加行间距。为了将图的两半分开,创建两个style=invis具有固定位置的隐藏style=invis节点(您可能想要使用neato它,可能overlap=false用作图形属性。这是一个简单的例子(使用不可见的样式来显示布局的外观):

graph test {
  overlap=false; splines=true
  edge [style=dotted, weight=10, len=.2]
  subgraph cluster_left {
    left [pos="-1,0!", color=red /* , style=invis */]
    a -- left
    b -- left
  }
  subgraph cluster_right {
    right [pos="1,0!", color=blue /* , style=invis */]
    c -- right
    d -- right
    e -- right
  }
  edge [style="", weight=1, len=1]
  a -- b
  b -- d
  d -- e
  c -- e
  b -- e
}

对于半圆,weight=1000, len=1在第一edge行设置并使用fdp而不是neato似乎会产生一些接近的东西(仍然有一些节点的边长稍微偏离)。您需要更多节点才能看到效果(我放入了类似的额外节点,be在其名称上带有数字后缀以进行测试)。

于 2013-11-07T21:33:13.293 回答