ggnet2绘制网络遇多重图错误及节点入度中心度调整问题
问题1:为何示例代码会生成多重图?
你用sample(LETTERS, size = 20, replace = TRUE)生成边数据时,重复采样会导致相同的起点-终点对多次出现(比如两次生成from="A", to="B")。igraph的graph_from_data_frame()函数默认会保留这些重复边,形成多重图(multiple graph)——即两个节点之间存在多条平行边。而ggnet2()不支持绘制这种包含平行边的多重图,因此会抛出错误。
你可以用is_multiple(g)验证图是否为多重图,或者用simplify(g)去掉重复边(合并平行边)来解决报错问题:
g <- simplify(graph_from_data_frame(df, directed = TRUE)) ggnet2(g)
问题2:如何根据入度中心度调整节点大小?
你之前的错误在于:inboundCentrality是添加在边数据框中的属性,而ggnet2()的node.size参数需要的是节点层面的属性。每个节点只需要一个入度值,而非每条边对应一个值。
正确的做法是在创建图后,计算每个节点的入度并添加为节点属性,再传递给ggnet2():
library(igraph) library(ggplot2) library(GGally) library(dplyr) # 生成边数据并过滤自环 df <- data.frame(from = sample(LETTERS, size = 20, replace = TRUE), to = sample(LETTERS, size = 20, replace = TRUE)) %>% filter(from != to) # 创建有向图(若需无向图,修改directed = FALSE) g <- graph_from_data_frame(df, directed = TRUE) # 计算入度并添加为节点属性 V(g)$in_degree <- degree(g, mode = "in") # 用节点的入度属性设置大小 ggnet2(g, node.size = "in_degree")
如果需要对入度值做缩放(避免节点过大/过小),可以用scales::rescale()调整:
V(g)$in_degree_scaled <- scales::rescale(degree(g, mode = "in"), to = c(3, 10)) ggnet2(g, node.size = "in_degree_scaled")
内容的提问来源于stack exchange,提问作者D. Studer
相关产品推荐
相关产品推荐

