R语言visNetwork网络图节点大小设置不生效问题求助
R语言visNetwork节点大小不生效问题排查与修复
问题背景
我正在使用R编程语言,找到了一段可生成节点大小不同的网络图的代码:
library(visNetwork) library(igraph) my_data <- data.frame( "Col_C" = c("AAA", "AAA", "AAB", "AAB", "AAB", "ABC", "CDE", "CDE", "CDE", "AAB", "AAB", "AAE"), "Col_D" = c("AAB", "AAC", "AAC", "ABC", "CDE", "CDE", "AAB", "AAE", "ADF", "AAE", "ADF","ADF") ) final <- data.frame(col = unique(unlist(my_data))) final$size = c(6,10,1,20,50,1,5) graph_B <- graph_from_data_frame(my_data, directed = FALSE, vertices = final) visIgraph(graph_B)
(配图:节点大小存在明显差异的网络图)
我尝试将此逻辑应用到以下代码中修改节点大小,但运行后节点大小并未改变:
library(tidyverse) library(visNetwork) library(htmlwidgets) set.seed(123) mat <- matrix(runif(5*5), nrow = 5, ncol = 5) mat <- round(mat, 2) nodes <- data.frame(id = 1:5) edges <- data.frame(from = sample(1:5, 100, replace = TRUE), to = sample(1:5, 100, replace = TRUE)) nodes$shape <- 'circle' nodes$size <- sample(1:10, 5, replace = TRUE) # 为节点分配随机大小 edges$weight <- apply(edges, 1, function(x) mat[x["from"], x["to"]]) edges$label <- as.character(apply(edges, 1, function(x) mat[x["from"], x["to"]])) nodes$label <- paste("Node", 1:5) nodes$size <- sample(1:10, 5, replace = TRUE) nodes$value <- nodes$size network <- visNetwork(nodes, edges) %>% visEdges(arrows = list(to = list(enabled = TRUE))) %>% visIgraphLayout(layout = "layout_in_circle") network
(配图:所有节点大小一致的网络图)
请问我哪里出错了?该如何修复?
问题原因
你使用的visIgraphLayout()函数会覆盖nodes数据框中手动设置的size参数,转而采用igraph布局默认的节点大小逻辑,导致自定义的节点大小无法生效。
第一段代码中,你先通过igraph创建图对象,再用visIgraph()直接转换,这个过程会完整保留igraph顶点的size属性;但第二段代码是先构建visNetwork的nodes/edges结构,再应用igraph布局,此时visIgraphLayout()会重置节点大小配置。
修复方案
有两种可行的修复方式:
方式一:使用visNetwork原生布局替代igraph布局
如果不需要依赖igraph的布局算法,直接用visNetwork自带的圆形布局即可,此时节点大小会正常生效:
network <- visNetwork(nodes, edges) %>% visEdges(arrows = list(to = list(enabled = TRUE))) %>% visLayout(layout = "circular") # 替换为visNetwork原生圆形布局 network
方式二:对齐第一段代码逻辑,先创建igraph对象再转换
按照第一段代码的思路,先将nodes和edges转换为igraph对象,确保节点大小属性被保留,再用visIgraph()转换并指定布局:
# 将nodes和edges转换为igraph有向图对象 graph_obj <- graph_from_data_frame(edges, directed = TRUE, vertices = nodes) # 使用visIgraph转换并设置布局 network <- visIgraph(graph_obj, layout = "layout_in_circle") %>% visEdges(arrows = list(to = list(enabled = TRUE))) network
两种方式都能让你设置的size参数正常显示节点大小差异。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

