我试图用igraph
包绘制(稀疏)加权图。我目前有一个邻接矩阵,但不能让graph.adjacency
函数识别边的权重。igraph创建加权邻接矩阵
考虑下面的随机对称矩阵:
m <- read.table(row.names=1, header=TRUE, text=
" A B C D E F
A 0.00000000 0.0000000 0.0000000 0.0000000 0.05119703 1.3431599
B 0.00000000 0.0000000 -0.6088082 0.4016954 0.00000000 0.6132168
C 0.00000000 -0.6088082 0.0000000 0.0000000 -0.63295415 0.0000000
D 0.00000000 0.4016954 0.0000000 0.0000000 -0.29831267 0.0000000
E 0.05119703 0.0000000 -0.6329541 -0.2983127 0.00000000 0.1562458
F 1.34315990 0.6132168 0.0000000 0.0000000 0.15624584 0.0000000")
m <- as.matrix(m)
要绘制,首先我必须得到这个邻接矩阵到适当的igraph
格式。这应该是相对简单的graph.adjacency
。根据我的graph.adjacency
文档的阅读,我应该做到以下几点:
library(igraph)
ig <- graph.adjacency(m, mode="undirected", weighted=TRUE)
但是,它不承认边权:
str(ig)
# IGRAPH UNW- 6 8 --
# + attr: name (v/c), weight (e/n)
# + edges (vertex names):
# [1] A--E A--F B--C B--D B--F C--E D--E E--F
plot(ig)
如何获得igraph识别边缘权重?
这似乎并不成为问题,但请注意,您在上面打印的矩阵不是对称的。 (尝试'isSymmetric(m)',然后比较'm [5,3]'和'm [3,5]'的值。) –
@ JoshO'Brien,它似乎是一个简单的复制和粘贴错误,A和E列中的数字有8个小数位,而其余的有7个。除此之外它是对称的:'isSymmetric(round(m,6))== TRUE'。有趣的是,'igraph'保留了小数位数最多的版本,并且在数字末尾加上了小数点后7位的差异时加上了0。 – TWL
权重在那里,'weight(e/n)'意味着有一个称为'weight'的边缘属性,它是数字。请参阅'?print.igraph'。但是它们不是默认绘制的,你需要将它们添加为'edge.label'。 –