【问题标题】:Vizualizing a bipartite graph with about 500 nodes可视化具有大约 500 个节点的二分图
【发布时间】:2013-11-08 06:55:44
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: graph visualization graphviz dot


    【解决方案1】:

    您可以使用ranksep 属性增加dot 中的行间距。为了将图的两半分开,创建两个具有固定位置的隐藏节点 (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
    }
    

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

    【讨论】:

    • 我把它注释掉了;取消注释并将真实版本的“dotted”更改为“invis”(隐藏边缘)。
    • 你怎么看,有没有办法使用 subgraph 命令在一个圆上分割节点?
    • stackoverflow.com/questions/2467450/… 有类似的东西;是否足够接近你想要的?
    • 我正在尝试听从你的建议,但是我的左右节点并没有足够吸引其他节点,即使它的权重是10000000。但是我不使用集群,使用集群是必要的吗?我不喜欢节点周围的框架。
    • 集群部分可能很重要;你可以移除集群周围的盒子,但我不记得有多随意。
    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 2012-01-13
    • 2016-12-26
    • 1970-01-01
    • 2011-07-21
    相关资源
    最近更新 更多