在R中使用igraph绘制图:边长与重量成比例

时间:2019-02-07 10:55:47

标签: python r graph igraph

我需要为加权无向图制作一个简单的图,其中唯一的边在单个中心节点和其他中心节点之间(即星形网络拓扑),因此我只需要等距布置节点(即每个连续的节点对之间的中心角相同)。但是,我的边缘被加权了,我希望边缘的长度与权重值成正比。有什么方法可以在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))

感谢您的帮助!

1 个答案:

答案 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创建