如何阻止igraph从邻接矩阵生成重复顶点?
问题原因与解决方法
核心问题:你用错了igraph的图生成函数。
graph_from_incidence_matrix是用来创建二分图的——它会把矩阵的行和列分别当成两个独立的节点集合,所以67行+67列就生成了134个顶点,这就是重复顶点的来源。而你的数据是邻接矩阵(描述同一类节点间的关系),应该用graph_from_adjacency_matrix函数。修正步骤:
- 替换图生成函数:把
graph_from_incidence_matrix换成graph_from_adjacency_matrix,并设置正确的参数适配无向带权邻接矩阵。 - 修正绘图参数:注意igraph里顶点形状的参数是
vertex.shape(单数),不是vertex.shapes;另外clan变量要确保来自bbnnames的对应列(比如bbnnames$clan),否则会报错。
- 替换图生成函数:把
修正后的代码:
network_data <- read.csv('bbnmatrix2.csv', header=T, row.names=1, as.is=T) bbnnames <- read.csv("bbnnames.csv", header=T, as.is=T) # 用邻接矩阵生成无向带权图 net2 <- graph_from_adjacency_matrix(as.matrix(network_data), mode = "undirected", weighted = TRUE, diag = FALSE) # 如果邻接矩阵对角线是自环,不需要的话设为FALSE # 计算度中心性作为顶点大小 vertex_size <- degree(net2) * 0.5 # 乘以系数调整大小,按需修改 # 绘图 plot(net2, vertex.label.color = "black", vertex.label = bbnnames$name, vertex.label.cex = 0.5, edge.color = "black", vertex.color = bbnnames$clan, # 假设clan是bbnnames里的列 edge.width = E(net2)$weight * 1.5, # 调整边宽系数 vertex.shape = bbnnames$status, vertex.size = vertex_size) # 用度中心性作为顶点大小
- 额外说明:
- 读取邻接矩阵后,建议转成矩阵格式(
as.matrix(network_data)),避免graph_from_adjacency_matrix处理数据时出错。 - 如果你的邻接矩阵包含自环(对角线非0),可以保留
diag=TRUE,否则设为FALSE去掉自环。 - 顶点大小和边宽的系数(比如*0.5、*1.5)可以根据可视化效果自行调整。
- 读取邻接矩阵后,建议转成矩阵格式(
内容的提问来源于stack exchange,提问作者peterkeenan
相关产品推荐
相关产品推荐

