分层数据的最佳图形绘制算法?

时间:2012-11-15 00:53:15

标签: algorithm language-agnostic graph graph-drawing

我有一组树的有向非循环图形,其意义如下:每个图形都有 root ,并且顶点被组织成级别,这样如果 v 1 v 2 是顶点,如果 v 1 的等级小于 v 2 的等级,则没有边缘从图中的 v 2 v 1 ,尽管 v <可能有很多边缘/ em> 1 到相同或更高级别的顶点。例如,表达式树,函数调用图或线性类层次结构将是这种图的示例。以下是此类图表的示例:

              A1            
             /  \           A1 -> A4, A3
            /    \          A3 -> A2, A6, A7
          A4  A2--A3        A2 -> A6
              | \ / \
              A6 \_ A7

有很多图形绘制算法,我无法确定哪种算法最适合这种情况。一些初步研究表明,绘制Hasse图的算法可能是合适的,但似乎这些算法的输出并不适合我试图建模的数据结构类型。还有几种用于建模分层数据的算法,但我不确定哪种算法可以平衡实现的简易性和效率。前一种方法的一个问题是这些图有根,也有方向。如果可能,算法将支持循环图,并最小化数值计算的数量,但这不是必需的。出于这些原因,我宁愿避免使用强制导向算法,如果可能的话,还要避免使用GraphViz算法,例如 dot

2 个答案:

答案 0 :(得分:1)

如果它只是一棵树,那么我之前看到这个Reingold–Tilford Tree drawing algorithm工作得非常好。

顺便说一下,我觉得让节点A2'上升'到与其祖先相同的水平的决定并没有真正帮助那么多。

相反,我会允许节点进一步下降而不是上升。 如下所示,我可以更好地绘制示例。

          A1            
         /  \           A1 -> A4, A3
        /    \          A3 -> A2, A6, A7
      A4     A3         A2 -> A6
            / | \
          A2  |  A7
            \ |
             A6

这样您甚至不需要标记边缘方向。 [我误解了你原来的图表吗?我认为A2和A7之间没有优势吧?]

答案 1 :(得分:1)

这不是一个真正的答案,但是评论太长了。

您的图表与一般有向无环图有何不同?

DAG不必有根,但我认为绘制图形没什么区别。

就级别而言,对于任何DAG,可以定义函数级别(v),使得对于任何边缘v i →v j ,级别(i)≤(j)级。平凡级函数是顶点的拓扑顺序中的顶点索引。另一个是从根到顶点的最长路径的长度。

Reingold-Tilford树绘制算法绘制有序树(即,从顶点边缘排序的树)。您的示例表明您的图形没有排序,实际上您面临的主要问题是找到边缘排序,从而最大限度地减少边缘交叉。所以这可能是您要解决的问题。 (这不是一个容易的问题。)

根据我的经验,

dot实际上与DAG相当不错,尽管它有时需要一些帮助。特别是,如果您知道每个顶点的级别,则可以使用属性“rank =”same“'为每个级别创建一个子图。 (见this example。)