2011-03-19 227 views
24

我想繪製一個網絡可視化,以類似於流程圖。我相當接近用下面的代碼,但我有幾個問題:如何使用固定位置控制igraph繪圖佈局?

  1. 這是最好的佈局()算法,或我可以手動分配>
  2. 我怎樣才能使每個節點的位置確定這些節點在劇情中不重疊(就像他們在這裏做的那樣)?
  3. 我可以將一個節點分配爲「錨點」還是起點?即,我可以讓「C」成爲最頂層還是最左邊的節點?

非常感謝!

library("igraph") 
L3 <- LETTERS[1:8] 
d <- data.frame(start = sample(L3, 16, replace = T), end = sample(L3, 16, replace = T), 
       weight = c(20,40,20,30,50,60,20,30,20,40,20,30,50,60,20,30)) 


g <- graph.data.frame(d, directed = T) 

V(g)$name 
E(g)$weight 

ideg <- degree(g, mode = "in", loops = F) 

col=rainbow(12) # For edge colors 

plot.igraph(g, 
    vertex.label = V(g)$name, vertex.label.color = "gray20", 
    vertex.size = ideg*25 + 40, vertex.size2 = 30, 
    vertex.color = "gray90", vertex.frame.color = "gray20", 
    vertex.shape = "rectangle", 
    edge.arrow.size=0.5, edge.color=col, edge.width = E(g)$weight/10, 
    edge.curved = T, 
    layout = layout.reingold.tilford) 

回答

32

igraph中的佈局定義在矩陣中,每個節點有2列和1行。第一列指示其x位置,第二列指示其y位置,並且比例不相關(它總是重新調整以適合-1到1的繪圖區域。您可以在繪圖之前通過調用圖形上的佈局函數來獲得此佈局:

l <-layout.reingold.tilford(g) 
l 
    [,1] [,2] 
[1,] 0 0 
[2,] -1 3 
[3,] 0 1 
[4,] 0 3 
[5,] 0 2 
[6,] 0 4 
[7,] 1 3 

這樣你可以改變它在手動想要的任何方式,然後將其發送到劇情:

plot.igraph(g, 
    vertex.label = V(g)$name, vertex.label.color = "gray20", 
    vertex.size = ideg*25 + 40, vertex.size2 = 30, 
    vertex.color = "gray90", vertex.frame.color = "gray20", 
    vertex.shape = "rectangle", 
    edge.arrow.size=0.5, edge.color=col, edge.width = E(g)$weight/10, 
    edge.curved = T, 
    layout = l) 

這似乎也可以設置參數params控制佈局abit。這是一個包含參數root的列表,顯然它可以用來設置圖形的根。該節點(reigramber igraph使用類似C的節點索引,第一個是0)。因此,設置在根「C」:

l <- layout.reingold.tilford(g,params=list(root=2)) 

編輯:另外的RGraphViz中有一些不錯的樹的佈局,可能是值得一試。


編輯2:

這是從我的包,它採用的是同一種佈局矩陣的圖形,以確定節點的位置,你可能會發現有用的源代碼的修改的摘錄:

gridLayout <- function(x) 
{ 
    LmatX <- seq(-1,1,length=ncol(x)) 
    LmatY <- seq(1,-1,length=nrow(x)) 

    loc <- t(sapply(1:max(x),function(y)which(x==y,arr.ind=T))) 
    layout <- cbind(LmatX[loc[,2]],LmatY[loc[,1]]) 
    return(layout) 
} 

什麼這個函數是變換矩陣指定在一個網格(類似於layout())佈局的兩列布局與x和y位置。定義一個零矩陣,併爲每個節點的整數從1到節點總數(這是igraph ID + 1)。

例如,對於一個愚蠢的4節點圖:

grid <- matrix(c(
    0,0,1,0,0, 
    2,0,3,0,4),nrow=2,byrow=TRUE) 

library("igraph") 

g <- graph.adjacency(matrix(1,4,4)) 

plot(g,layout=gridLayout(L)) 
+0

感謝您的提示!像這樣把位置放在一起:l2 < - as.matrix(data.frame(c(0,6,12,12,12,24,24,24),c(0,.5,.5 ,0,-1,1,-1,。25))) – 2011-03-20 04:51:13

+3

2年後,這個答案對我有幫助:-) – 2013-06-30 14:26:00

+1

Sacha,當我應用你的代碼時,我得到ncol(x)中的錯誤:找不到對象'L'。在plot(g,layout = gridLayout(L))這一行中,可能有一個我無法理解的問題。 – 2016-10-26 13:42:50

4

,如果你要分配的節點位置自己是增加與您的數據表標記爲X和Y列一個不太複雜的方法比上面這些列中各個節點的x和y座標。例如

library('igraph') 
nodes <- c('a','b','c','d') 
x <- c(0,1,2,3) 
y <- c(0,1,2,3) 
from <- c('a','b','c') 
to <- c('b','c','d') 
NodeList <- data.frame(nodes, x ,y) 
EdgeList <- data.frame(from, to) 
a<- graph_from_data_frame(vertices = NodeList, d= EdgeList, directed = FALSE) 
plot(a) 

enter image description here