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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:13:13