2017-02-05 20 views
2

ggraph 패키지로 네트워크를 플롯하고 각 노드의 좌표를 지정하려고합니다. igraph 패키지로 구현할 수 있지만 ggraph 패키지로는이 작업을 수행 할 수 없습니다. 여기 ggraph 네트워크 플롯 : 노드 좌표 지정

# reproducible example to generate a random graph 
library(igraph) 
g1 <- erdos.renyi.game(20, 1/2) 
plot(g1) 

# function to produce coordinates for each node in order of the node 
# degree (number of links per node) 
coord <- function(g){ 
    n.nod <- length(V(g)) 
    mat.c <- matrix(0, nrow = n.nod, ncol = 2) 
    deg <- degree(g) 
    uniq.deg <- unique(deg) 
    min.d <- min(deg); max.d<- max(deg) 
    spa <- 10/(max.d - min.d) # how much to increment 0 to 10 space along y-axis 

    divi.y.1 <- seq(from = min.d, to=max.d, by = 1) 
    divi.y.2 <- seq(from = 0, to=10, by = spa) # both have same length 

    ind.x <- c(); ind.x[1] = 0 
    for(x in 2:n.nod){ 
     ind.x[x] <- ind.x[x-1] + 0.1 
     if(ind.x[x] >= 10){ 
     ind.x[x] = ind.x[x-1] - 0.1 
     } 
    } 
d1 <- data.frame(divi.y.1, divi.y.2) 

# plotting space of grid is (0,0), (0, 10), (10, 10), (10, 0) 
for(i in 1:n.nod){ 
    # y-axis in order 
    inD <- which(d1$divi.y.1 == deg[i]) 
    mat.c[i, 2] <- d1[inD,2] 
} 
mat.c[, 1] <- ind.x 
return(data.frame(mat.c)) 
} 

igraph 객체를 플롯의 "구식"방법 :

# plot igraph object - the old fashion way 
x11() 
plot(g1, layout = coord(g1), rescale = T, frame=T, 
vertex.frame.color = "black", edge.color = "lightsteelblue", 
edge.width = 1, vertex.label.cex = 1, 
vertex.label.color = "black", 
main = "Nodes in order of degree: top have more links, bottom fewer links") 

링크 ggraph에 문서 here입니다. 패키지 설치 지침은 GitHub 저장소 ggraph을 참조하십시오 (필요> R.3.3 버전). 다음은 작동 ggraph 플롯 (하지만 각 노드에 대한 좌표를 지정하지 않은)입니다 :

library(ggraph) 
V(g1)$NaMe <- seq(1:20) 

x11() 
    ggraph(g1, 'igraph', algorithm = 'kk') + 
    geom_edge_link(colour = "black", alpha = 0.8, show.legend = F) + 
    geom_node_label(aes(label = NaMe)) + ggtitle("ggraph plot: How to allocate coordinate for each node?") + 
    ggforce::theme_no_axes() 

하는 것은 다음은 각 노드에 대해 지정된 좌표로 ggraph 플롯을 내 시도이다.

g <- make_ring(10) + make_full_graph(5) 
coords <- layout_(g, as_star()) 
plot(g, layout = coords) 
# try to replicate this example: 
coords2 <- add_layout_(g1, coord(g1)) 

는 또한 this function를 사용하여 시도 : 노드의 좌표가 플롯에 전달된다 ggraph()에서 유사 사례 및 이전 시도에 따라, 나는 다음 시도했다. 문서에 예제가 없으므로 어렵습니다.

Lay <- layout_igraph_manual(g1, coord(g1)) 
Lay <- layout_igraph_igraph(g1, coord(g1)) 

x11() 
ggraph(g1, 'igraph', algorithm = 'kk') + add_layout_(Lay) + 
# layout_igraph_circlepack() + 
geom_edge_link(colour = "black", alpha = 0.8, show.legend = F) + 
geom_node_label(aes(label = NaMe)) + ggtitle("ggraph plot: Cannot allocate coordinate for each node") + 
ggforce::theme_no_axes() 

답변

1

당신은 일반적으로 ggraph를 사용하는 경우 노드 좌표에 대해 생각하지 않습니다 - 그들은 공급 자동으로 선택한 레이아웃을 기반으로합니다. 사전에 레이아웃을 직접 계산하려면 수동 레이아웃을 사용하십시오. layout_igraph_manual

1

Thanks @ ThomasP85 (ggraph의 개발자)와 같은 설명서를 확인하십시오. 이 예에서는 각 노드의 좌표를 지정하려고했습니다. 나는 layout_igraph_manual, layout_, add_layout_ 및 많은 다른 것들을 시도했으며 작동하지 않았습니다. 당신이 layout_igraph_manual를 사용하여 위의 코드와 작업 예제를 제공 할 수 있는지 일을 무슨 짓을

가 ThomasP85 @이

co2<- data.frame(coord(g1)) # my mistake above, the output of coord() should be a matrix 
colnames(co2)<- c("x", "y") 
Lay<- createLayout(g1, layout = "nicely") # try any layout 
Lay$x<- co2$x # <== now overwrite their coordinates 
Lay$y<- co2$y 


x11() # <==== this is ggraph version of the igraph plot above 
ggraph(graph=g1, data=Lay) + 
geom_edge_link(colour = "black", alpha = 0.5, show.legend = F) + 
geom_node_label(aes(label = NaMe)) + ggtitle("Nodes with higher degree at top, lower degree nodes at the bottom") + 
ggforce::theme_no_axes() 

했다, 그것은 매우 감사하겠습니다.

1

layout_igraph_manual을 직접 호출하는 것은 저자의 의도라고 생각하지 않습니다. 레이아웃의 이름을 "수동"으로 지정하면 꼭지점을 수동으로 레이아웃하는 데 필요한 인수를 전달할 수 있습니다.

coords <- coord(g1) 
names(coords) <- c("x","y") 
coords <- as.data.frame(coords) 

ggraph(g1, layout = "manual", circular = FALSE, node.positions = coords)+ 
    geom_edge_link(colour = "black", alpha = 0.8, show.legend = F) + 
    geom_node_label(aes(label = NaMe)) + ggtitle("ggraph plot: How to allocate coordinate for each node?") + 
    ggforce::theme_no_axes() 

문서에 따르면이 수동 레이아웃이 dataframe 것이 중요하며 열을 xy을 포함 : 이것은 내가 제대로 이해한다면 당신은 결국 무엇 저를 얻었다. 이 작업을 coord() 함수의 출력으로 수행했습니다. 이 형식으로 데이터를 반환하기 위해 업데이트하려고합니다.