指定图中某些节点的位置

yos*_*bai 5 javascript algorithm r graph d3.js

有没有办法指定连接图的某个节点子集的位置,而某些算法决定其他节点的位置?我希望找到一种算法,将边缘视为弹簧,以便它不会远离其他节点,例如graphopt.我查看了igraph中的其他几种算法,例如lgl,drl,但它们似乎都不允许指定节点的位置,我必须让算法完全控制所有节点的位置.

我问这个是因为我有数据网络,有些节点我可以找到近似的地理坐标.我希望在地图上显示整个网络.在地图上查看网络然后我可以迭代地识别具有一些地理标识的更多节点,并且最后我具有至少在视觉上具有相当准确性的地理参考图.

我开始使用R上的igraph,但我愿意尝试其他软件包/语言,甚至是GIS工具,如果有什么东西接近我正在寻找的东西.

谢谢!

[编辑]

毕竟,这个问题不是一个很好的问题,但是自从我开始这个问题之后,让我进一步描述一下我在寻找什么.希望我所寻求的是有意义的,有人之前已经这样做了.

G5W的建议正朝着我想要的方向发展,但我希望能够应用原始算法的原理,然后将其固定到所需的方向.

FR方法的论文说:

图绘制只有两个原则:

  • 由边缘连接的顶点应相互靠近.
  • 不应将顶点绘得太近.

所以我认为包括路径10-8-4-1-3在内的大循环应该缩小并接近剩余的节点.我想我可以找到如下的布局,如果我像G5M那样修复四点.

我想要的是

我认为算法可能偶然创建这样的图形,并尝试如下,非常粗糙,强力的方法.但算法从来没有生成我想要的...我想我需要指定一些豁免算法来处理固定节点之间的那些边缘.

library(igraph)
set.seed(1)
g = erdos.renyi.game(10, 0.3)
LO = layout_with_fr(g)
plot(g, layout=LO)

n <- nrow(LO)
i <-  0
for (i in 1:100000) {
#  i <- i + 1
  LO <- layout_with_fr(g)
  chk <- c(all(LO[c(5,7),2] >= sort(LO[-c(5,7),2])[n-3]), # 5,7 should come close to top
           all(LO[c(2,9),2] <= sort(LO[-c(2,9),2])[2]),   # 2,9 near bottom 
           all(LO[c(2,7),1] <= sort(LO[-c(2,7),1])[2]),   # 2,7 toward left
           all(LO[c(5,9),1] >= sort(LO[-c(5,9),1])[n-3])  # 5,9 toward right
  ) 
  if (all(chk)>1 ) break      
}
Run Code Online (Sandbox Code Playgroud)

[EDIT2]

还在寻找一些方法来做到这一点.我发现了一个d3页面Stick Force Layout,这似乎是我想要的.问题是,一旦我对布局感到满意,我不确定是否可以导出坐标.我也许想要能够节省中间体.这意味着我应该能够节点协调与属性,如果他们卡住或不.而这个数据进出.如果对于了解JS的人来说这是微不足道的,请给我一个指针.如果不是,我尝试提出json输入/输出接口.

由用户指定的没有节点位置的图形,由某种力布局算法确定

图,没有指定节点pos

我选择一些节点的位置,以使图形树状.这只是一个例子,但我的观点是,我希望能够粗略地布局布局,而不必确定每个节点的位置.

我想出了什么,例如树状布局

G5W*_*G5W 5

您没有为图表或您尝试实现的特定布局提供任何示例数据,因此我将采用随机图和简单配置作为目标.我们的想法是,您可以让任何算法布置所有点,然后调整您要指定的点的位置.

## basic graph for illustration
library(igraph)
set.seed(1)
g = erdos.renyi.game(10, 0.3)
LO = layout_with_fr(g)
plot(g, layout=LO)
Run Code Online (Sandbox Code Playgroud)

初始位置

好的,现在假设我们想要取节点2,5,7和9并将它们放在一个没有任何边缘交叉的盒子里.我想要做的是采用基本的盒子布局并移动它,使这四个节点及其边缘远离图形的其余部分.我将只移动这四个节点,使它们略高于其他节点.

UB = max(LO[,2])
DesiredLO = matrix(c(0,0,0,1,1,0,1,1), nrow=4, ncol=2, byrow=TRUE)
LO[c(2,7,9,5), ]  = DesiredLO + matrix(rep(LO[2,], 4), ncol=2, byrow=TRUE)
LO[c(2,7,9,5), 2] = LO[c(2,7,9,5), 2] + UB - LO[2,2] + 1
plot(g, layout=LO)
Run Code Online (Sandbox Code Playgroud)

选定的节点专门放置

也许你可以根据自己的需要调整它.如果没有,请使用本示例或类似的东西,以更加清晰地明确你什么想要.