- graph/
- Graph 如何重新分配图形元素以最大限度地提高可读性?
Graph 如何重新分配图形元素以最大限度地提高可读性?
Graph 如何重新分配图形元素以最大限度地提高可读性?,graph,graph-theory,graph-algorithm,rectangles,Graph,Graph Theory,Graph Algorithm,Rectangles,我有一个由节点组成的图。每个节点可以有多个父节点和/或子节点。我想显示该图以及节点之间的连接
但我不知道如何重新分配节点以最大限度地提高可读性。目前我面临以下问题:
节点连接相互交叉太多,即使这是不必要的,也可以避免
节点之间的连接太长
有些连接具有相同的角度,因此它们重叠并成为一条直线
列i和列i-2(以及更远)之间的连接有时直接通过列i-1
此外,我只能垂直移动节点,不能水平移动,因为列的数量是有限的
为了让我自己更容易,我尝试将节点放置在网格状的模式中。我设法按列对它们进行了分组。但是
我有一个由节点组成的图。每个节点可以有多个父节点和/或子节点。我想显示该图以及节点之间的连接
但我不知道如何重新分配节点以最大限度地提高可读性。目前我面临以下问题:
- 节点连接相互交叉太多,即使这是不必要的,也可以避免
- 节点之间的连接太长
- 有些连接具有相同的角度,因此它们重叠并成为一条直线
- 列
i
和列i-2
(以及更远)之间的连接有时直接通过列i-1
此外,我只能垂直移动节点,不能水平移动,因为列的数量是有限的
为了让我自己更容易,我尝试将节点放置在网格状的模式中。我设法按列对它们进行了分组。但是我需要遍历各个列,并将它们与其他列进行比较,以重新安排内容。我不知道从哪里开始
UPD:我可能错了,但我觉得我的图形对齐问题在某种程度上与最短路径的典型图形问题有关。除了在我的例子中,有多个路径应该同时计算,并且一些节点只能传递一次
在下图中,你可以看到一个近乎理想的再分配,我只是在纸上涂鸦(从左到右的方向显示父到子的连接)
您可以实施。或者您可以使用已经支持强制导向绘图的图形绘图库,例如D3
您可以实施。或者您可以使用已经支持强制导向绘图的图形绘图库,例如D3
这是图形布局和绘图问题。您可以采取以下两种方法之一
使用现有的库:有许多图形布局库可用,例如GraphViz、Gephi、D3js等。您可以直接使用它们的API,也可以找到构建在它们之上的应用程序/工具。但要获得最佳布局,您需要对布局族进行猜测。e、 g.分层图形布局(适用于密集但分层的图形,如流程图)树布局(当图形实际上是树或森林时使用。树有许多变体)、放射状树布局(同样适用于树,但在极坐标系中)、强制导向布局(当您不知道什么视觉结构最能代表数据时,这是一个很好的起点). 所有这些布局都有许多自定义参数,如节点间距、节点和边间距、图形的整体纵横比等。
自己实现布局算法
有关不同族的图形绘制算法的详细内容,请参见此处
如果你不想进入细节,这里有一些快速的起点
对于图形,执行拓扑排序,并按照拓扑顺序将节点放置在层中。它可以给你一个很好的起点,帮助你避免不必要的交叉。网格在这里可能是个好主意。但将节点按拓扑顺序放置在网格中
或者,找到该图的生成树,使用树布局绘制生成树,然后添加剩余的边
对于树:使用递归自底向上方法放置子树。对于径向树,进行直线布局,然后转换为极坐标系
对于未知族:使用力导向方法。定义两个节点之间的力(例如弹簧力),然后进行迭代以找到平衡点
图形的最佳自动可视化是一个非常有趣的领域,人们正在尝试许多ML技术。这是图形布局和绘图问题。您可以采取以下两种方法之一
使用现有的库:有许多图形布局库可用,例如GraphViz、Gephi、D3js等。您可以直接使用它们的API,也可以找到构建在它们之上的应用程序/工具。但要获得最佳布局,您需要对布局族进行猜测。e、 g.分层图形布局(适用于密集但分层的图形,如流程图)树布局(当图形实际上是树或森林时使用。树有许多变体)、放射状树布局(同样适用于树,但在极坐标系中)、强制导向布局(当您不知道什么视觉结构最能代表数据时,这是一个很好的起点). 所有这些布局都有许多自定义参数,如节点间距、节点和边间距、图形的整体纵横比等。
自己实现布局算法
有关不同族的图形绘制算法的详细内容,请参见此处
如果你不想进入细节,这里有一些快速的起点
对于图形,执行拓扑排序,并按照拓扑顺序将节点放置在层中。它可以给你一个很好的起点,帮助你避免不必要的交叉。网格在这里可能是个好主意。但将节点按拓扑顺序放置在网格中
或者,找到该图的生成树,使用树布局绘制生成树,然后添加剩余的边
对于树:使用递归自底向上方法放置子树。对于径向树,进行直线布局,然后转换为极坐标系
对于未知族:使用力导向方法。定义两个节点之间的力(例如弹簧力),然后进行迭代以找到平衡点
图形的最佳自动可视化是一个非常有趣的领域,人们在这里尝试了许多ML技术。如前所述,绘制一个边交叉数最少的图形通常是一个NP难问题,而且您的约束(列中的节点)似乎没有帮助。第一步是允许弯曲