2017-04-24 21 views
1

에는 최소 및 최대 값에 비례하는 R에 대한 igraph에서 네트워크의 링크 또는 노드를 그릴 수있는 방법이 있습니까?R에 대한 그래프의 비례 링크 또는 노드 크기?

드로잉에 링크 및 노드 속성을 사용하는 것이 igraph에서 매우 편리하지만 일부 네트워크에서는 네트워크에서 발견되는 최소값과 최대 값의 차이가 매우 추악한 그림이됩니다. 예를 들어,이 코드를 참조 :

#Transforming a sample network (Safariland) from the package bipartite into an igraph object 
mat = Safariland 
mat2 = cbind.data.frame(reference=row.names(mat),mat) 
list = melt(mat2, na.rm = T) 
colnames(list) = c("plant","animal","weight") 
list[,1] = as.character(paste(list[,1])) 
list[,2] = as.character(paste(list[,2])) 
list2 = subset(list, weight > 0) 
g = graph.data.frame(list2) 
g2 = as.undirected(g) 

#Plotting the igraph object with edge widths proportional to link weights 
plot(g2, 
edge.width = E(g2)$weight) 

결과적으로 너무 큰 링크 가중치의 차이로, 홀수적인 네트워크이다. 최소 한계 이내에서 어떻게 가장자리를 그리면 네트워크가 더 좋아 보이나요?

대단히 감사합니다.

답변

1

플롯 기능에 전달하기 전에 값에 수학 또는 기능을 적용 할 수 있습니다.

mapToRange<-function(x,from,to){ 
    return( (x - min(x))/max(x - min(x)) * (to - from) + from) 
} 

라인 폭으로 나쁜 임의 가중치를 예를 들어 그래프를 만들 : 은 당신이 원하는 것은 예를 a rescaling function to map values to a different range as in this stackoverflow answer입니다

library(igraph) 
g<-erdos.renyi.game(20,0.5) 
E(g)$weight<-runif(length(E(g)))^3 *100 

나쁜 줄거리 :

plot(g, edge.width = E(g)$weight) 

더 플롯, 스케일링 먼저 상기 함수를 사용하여 1과 10 사이의 값으로 에지 가중치를 계산하십시오.

weightsRescaled<-mapToRange(E(g)$weight,1,10) 
plot(g, edge.width = weightsRescaled) 

같은 일보다 간결 :

plot(g, edge.width = mapToRange(E(g)$weight,1,10)) 
+0

감사합니다! 완벽하게 작동했습니다! – Marco