我需要为加权无向图制作一个简单的图,其中唯一的边在单个中心节点和其他中心节点之间(即星形网络拓扑),因此我只需要等距布置节点(即每个连续的节点对之间的中心角相同)。但是,我的边缘被加权了,我希望边缘的长度与权重值成正比。有什么方法可以在R或Python中完成此操作吗?我一直在研究igraph包,但似乎找不到合适的布局。这是我使用的示例数据框:
d = data.frame("n1"=c('A','A','A','A'), "n2"=c('B','C','D','E'), "weight"=c(1,1.5,2,5))
感谢您的帮助!
答案 0 :(得分:1)
我不相信有专门的布局可以做到这一点,但是您可以通过创建一组布局坐标,然后根据权重缩放它们,以一种非常直接的方式来达到这种效果。
下面的R中的示例代码:
library(igraph)
# toy data
d = data.frame("n1"=c('A','A','A','A'), "n2"=c('B','C','D','E'), "weight"=c(1,1.5,2,5))
g <- graph_from_data_frame(d)
# we can create a layout object that is just coordinate positions
coords <- layout_(g, as_star())
coords
#> [,1] [,2]
#> [1,] 0.000000e+00 0.000000e+00
#> [2,] 1.000000e+00 0.000000e+00
#> [3,] 6.123234e-17 1.000000e+00
#> [4,] -1.000000e+00 1.224647e-16
#> [5,] -1.836970e-16 -1.000000e+00
# Knowing this is a star the N nodes should have N-1 edges. We can scale
# The N-1 positions by the weights
weight.scale <- c(1, d$weight)
coords2 <- weight.scale * coords
coords2
#> [,1] [,2]
#> [1,] 0.000000e+00 0.000000e+00
#> [2,] 1.000000e+00 0.000000e+00
#> [3,] 9.184851e-17 1.500000e+00
#> [4,] -2.000000e+00 2.449294e-16
#> [5,] -9.184851e-16 -5.000000e+00
# we can inspect
plot(g, layout = coords2)
由reprex package(v0.2.1)于2019-02-07创建