如何在R的NetworkD3 forceNetwork中按相关性为边着色?
解决igraph转networkD3时边属性匹配与着色问题
核心思路
通过节点名称映射将igraph中丢失的边属性(X3)准确关联到networkD3的边列表,避免手动核对;同时配置forceNetwork实现节点大小调整、节点分组着色及边的正负相关性着色。
完整代码实现
library(igraph) library(networkD3) library(dplyr) # 1. 将igraph对象转换为networkD3格式,设置节点分组(细菌/真菌) netd3 <- igraph_to_networkD3(sparcc.graph, group = ifelse(grepl("Bacteria", V(sparcc.graph)$name), "Bacteria", "Fungi")) # 2. 添加基于betweenness的节点大小 netd3$nodes <- data.frame(netd3$nodes, nodesize = sqrt(betweenness(sparcc.graph)/3)) # 3. 提取igraph的边属性并匹配到networkD3边列表 # 提取igraph边数据(包含X3相关性属性) edges_attr <- as_data_frame(sparcc.graph, what = "edges") # 创建节点名称到networkD3 0-based索引的映射 node_index_map <- setNames(seq_len(nrow(netd3$nodes)) - 1, netd3$nodes$name) # 将igraph边中的节点名称转换为networkD3的source/target索引 edges_attr$source <- node_index_map[edges_attr$from] edges_attr$target <- node_index_map[edges_attr$to] # 处理无向边的双向匹配(避免source/target顺序不一致导致匹配失败) edges_attr_rev <- edges_attr %>% rename(source = target, target = source) # 合并X3属性到networkD3边列表 netd3$links <- netd3$links %>% left_join(edges_attr %>% select(source, target, X3), by = c("source", "target")) %>% left_join(edges_attr_rev %>% select(source, target, X3), by = c("source", "target"), suffix = c("", "_rev")) %>% mutate(X3 = coalesce(X3, X3_rev)) %>% select(-X3_rev) # 4. 定义颜色映射函数 # 节点颜色(细菌/真菌) node_color_func <- JS('d3.scaleOrdinal().domain(["Bacteria", "Fungi"]).range(["#AC88FF", "#E7861B"])') # 边颜色(负相关-红色,正相关-绿色) link_color_func <- JS('function(d) { return d.X3 == "-1" ? "#FF3333" : "#33CC33"; }') # 5. 绘制交互式网络图 forceNetwork( Links = netd3$links, Nodes = netd3$nodes, Source = "source", Target = "target", NodeID = "name", Group = "group", LinkGroup = "X3", legend = TRUE, colourScale = node_color_func, linkColour = link_color_func, Nodesize = "nodesize", zoom = TRUE, opacity = 0.8, linkWidth = 1.5 )
关键细节说明
- 节点索引映射:networkD3使用0-based索引,而igraph的节点名称是字符串,通过
node_index_map将名称转换为对应索引,确保边属性匹配准确。 - 无向边处理:无向图的边在networkD3中可能以反向顺序存储,通过反转边的source/target并二次匹配,避免属性丢失。
- 颜色配置:节点颜色通过
colourScale绑定分组,边颜色通过自定义JS函数根据X3值动态设置,同时启用LinkGroup显示边的相关性图例。
内容的提问来源于stack exchange,提问作者co-occurringnetwork
相关产品推荐
相关产品推荐

