在R中使用visNetwork绘制网络图,如何实现同组节点聚集?
解决visNetwork网络图抖动及同组节点聚集问题
问题背景
现有包含分组信息的nodes数据框,以及edges.csv边数据:
- 使用
visNetwork(nodes, edges)绘图时,图表持续抖动无法稳定,添加visPhysics(stabilization = FALSE)也无效 - 改用
visIgraphLayout()布局后,同组节点未按预期聚集
数据准备
library(visNetwork) library(igraph) # 构造nodes数据框 nodes <- structure(list(id = c("AC006329.1", "AC027796.4", "AC111170.2", "AC111170.3", "AC138207.4", "AP000695.2", "CDK15", "COL14A1", "COL15A1", "DDX11-AS1", "FOXP4-AS1", "IFNG-AS1", "ITGB2-AS1", "LINC00944", "LINC01213", "LINC01395", "MIR155HG", "MSTRG.108144", "MSTRG.110466", "MSTRG.11483", "MSTRG.130624", "MSTRG.134576", "MSTRG.147129", "MSTRG.180740", "MSTRG.180762", "MSTRG.24184", "MSTRG.9061", "SERHL"), label = c("AC006329.1", "AC027796.4", "AC111170.2", "AC111170.3", "AC138207.4", "AP000695.2", "CDK15", "COL14A1", "COL15A1", "DDX11-AS1", "FOXP4-AS1", "IFNG-AS1", "ITGB2-AS1", "LINC00944", "LINC01213", "LINC01395", "MIR155HG", "MSTRG.108144", "MSTRG.110466", "MSTRG.11483", "MSTRG.130624", "MSTRG.134576", "MSTRG.147129", "MSTRG.180740", "MSTRG.180762", "MSTRG.24184", "MSTRG.9061", "SERHL"), group = structure(c(1L, 6L, 6L, 6L, 4L, 3L, 4L, 4L, 4L, 1L, 1L, 2L, 2L, 2L, 5L, 5L, 2L, 4L, 2L, 1L, 6L, 5L, 5L, 3L, 3L, 3L, 1L, 5L), levels = c("blue", "brown", "cyan", "green", "purple", "red"), class = "factor")), row.names = c(NA, -28L), class = "data.frame") # 读取边数据 edges <- read.csv("edges.csv")
解决方案一:调整物理引擎参数(稳定+自然聚集)
通过配置物理引擎的迭代次数、吸引/排斥规则,让图表稳定的同时,引导同组节点聚集:
visNetwork(nodes, edges) %>% # 设置分组颜色,增强视觉区分 visGroups(groupname = "blue", color = "blue") %>% visGroups(groupname = "brown", color = "brown") %>% visGroups(groupname = "cyan", color = "cyan") %>% visGroups(groupname = "green", color = "green") %>% visGroups(groupname = "purple", color = "purple") %>% visGroups(groupname = "red", color = "red") %>% # 核心物理引擎配置 visPhysics( stabilization = list(enabled = TRUE, iterations = 2000), # 足够迭代次数让图表稳定 solver = "repulsion", repulsion = list( nodeDistance = 150, centralGravity = 0.2, springLength = 200, springConstant = 0.05, damping = 0.9, avoidOverlap = 0.5 ), # 同组节点增强吸引力 attraction = list( enable = TRUE, getDistance = function(d) { if (nodes$group[which(nodes$id == d[1])] == nodes$group[which(nodes$id == d[2])]) { return(100) # 同组节点间距减半 } else { return(300) # 异组节点保持原间距 } } ) ) %>% visOptions(highlightNearest = TRUE, nodesIdSelection = TRUE)
解决方案二:igraph预计算布局(精准聚集+无抖动)
先利用igraph生成带分组权重的布局,再传给visNetwork并关闭物理引擎,彻底解决抖动问题:
# 转换为igraph对象 ig <- graph_from_data_frame(edges, directed = FALSE, vertices = nodes) # 为同组节点的连接设置更高权重,强化聚集效果 E(ig)$weight <- ifelse(V(ig)$group[ends(ig, E(ig))[,1]] == V(ig)$group[ends(ig, E(ig))[,2]], 5, 1) # 基于权重计算Fruchterman-Reingold布局 layout <- layout_with_fr(ig, weights = E(ig)$weight) # 将布局坐标写入nodes数据框 nodes$x <- layout[,1] nodes$y <- layout[,2] # 绘制网络图,关闭物理引擎避免抖动 visNetwork(nodes, edges) %>% visGroups(groupname = "blue", color = "blue") %>% visGroups(groupname = "brown", color = "brown") %>% visGroups(groupname = "cyan", color = "cyan") %>% visGroups(groupname = "green", color = "green") %>% visGroups(groupname = "purple", color = "purple") %>% visGroups(groupname = "red", color = "red") %>% visPhysics(enabled = FALSE) %>% # 使用预计算布局,关闭物理引擎 visOptions(highlightNearest = TRUE, nodesIdSelection = TRUE)
内容的提问来源于stack exchange,提问作者beginner
相关产品推荐
相关产品推荐

