R的图表中的比例链接或节点大小?

时间:2017-04-24 19:12:03

标签: graph igraph bipartite sna

有没有办法在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 个答案:

答案 0 :(得分:1)

您可以在将值传递给绘图函数之前将任何数学或函数应用于值。 你想要的是例如a rescaling function to map values to a different range as in this stackoverflow answer

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

使用线宽不好的随机权重制作示例图:

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