R 图中的比例 link 或节点大小?
Proportional link or node size in graph for R?
有没有办法在 igraph 中绘制网络的 link 或节点,使 R 与最小值和最大值成比例?
使用link和节点属性进行绘图在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)
结果是一个看起来很奇怪的网络,因为 link 之间的差异使它的权重太大。如何在最小-最大范围内绘制这些边,使网络看起来更好?
非常感谢。
在将值传递给绘图函数之前,您可以对这些值应用任何数学或函数。
你想要的是例如 a rescaling function to map values to a different range as in this Whosebug 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))
有没有办法在 igraph 中绘制网络的 link 或节点,使 R 与最小值和最大值成比例?
使用link和节点属性进行绘图在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)
结果是一个看起来很奇怪的网络,因为 link 之间的差异使它的权重太大。如何在最小-最大范围内绘制这些边,使网络看起来更好?
非常感谢。
在将值传递给绘图函数之前,您可以对这些值应用任何数学或函数。 你想要的是例如 a rescaling function to map values to a different range as in this Whosebug 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))