簡體   English   中英

指定圖中某些節點的位置

[英]specify position of some nodes in a graph

當某種算法確定其他節點的位置時,是否可以指定連接圖的某個節點子集的位置? 我希望找到一種算法,該算法將邊緣像spring一樣對待,以免與其他節點相距太遠,例如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      
}

[EDIT2]

仍在尋找實現此目的的方法。 我找到了d3頁面Stick Force Layout ,這似乎是我想要的。 問題是我不確定對布局滿意后是否可以導出坐標。 另外,我可能希望能夠保存中間體。 因此,這意味着我應該能夠與屬性一起協調節點,無論它們是否卡住。 並且此數據進出。 如果這對了解JS的人來說微不足道,請給我一個指導。 如果沒有,我嘗試提供json輸入/輸出接口。

由用戶指定的無節點位置的圖,由某種力布局算法確定

圖,未指定節點pos

我選擇一些節點的位置,以使圖樹狀。 這只是一個示例,但我的觀點是我希望能夠粗略地布局,而不必確定每個節點的位置。

我想出的東西,例如樹狀布局

您沒有為圖形或要實現的特定布局提供任何示例數據,因此我將隨機圖形和簡單配置作為目標。 這個想法是,您可以讓任何算法對所有點進行布局,然后調整要指定的點的位置。

## 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)

初始位置

好的,現在假設我們要取節點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)

選定的節點專門放置

也許您可以使它適應您的需求。 如果沒有,請使用本示例或類似的東西,以更加清晰地明確想要什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM