可视化一个大约有500个节点的二分图

3

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

目前我正在尝试使用graphviz来完成。该图具有两种类型的节点。我希望第一种类型在绘图的左侧,另一种节点在右侧。如果我使用dot进行普通绘图,则是两行节点的狭长条形。这些行太靠近了,所以很难识别节点之间的任何单独边缘。我尝试了其他布局算法,如circo。我喜欢节点在圆上的位置,但我不知道如何将节点拆分为左半圆和右半圆。

我想要的完美输出是:节点沿着圆分布,但是两种类型的节点属于不同的半圆。是否有一种方法可以使用graphviz实现呢?

如果在graphviz中难以实现,您会建议更好的工具吗?

1个回答

3
您可以使用ranksep属性增加dot中行之间的间距。为了将图形的两个部分分开,创建两个隐藏节点(style = invs)并固定它们的位置,然后使用不可见的边(style = invs)将每个“真实”节点连接到其半部分的固定节点。您可能想要使用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
}

对于一个半圆,将第一行的edge中的weight=1000, len=1设置并使用fdp代替neato似乎可以产生接近的效果(仍有一些节点的边长度略有偏差)。您需要更多的节点来看到效果(我添加了额外的节点,类似于be,但名称带有数字后缀进行测试)。

我将其注释掉了;取消注释并将“dotted”更改为“invis”(以隐藏边缘)以获取真实版本。 - Jeremiah Willcock
你觉得是否有办法使用子图命令在圆上分割节点? - ashim
这里有一个类似的网址:https://dev59.com/JXE95IYBdhLWcg3wE52C;那个对你想要的是否足够接近? - Jeremiah Willcock
我正在尝试遵循您的建议,但是我的左右节点吸引其他节点的能力不够强,即使它的权重为10000000。但我没有使用集群,使用集群是否必要?我不喜欢节点周围的框架。 - ashim
集群部分可能很重要;你可以删除集群周围的框,但我不记得怎么做了。 - Jeremiah Willcock

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