You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:44:57