在R中如何为igraph加权关联矩阵添加数值权重以绘制加权网络图
R语言igraph构建带评分权重的导演-编剧合作网络实现方案
你当前用table只能生成统计合作次数的关联矩阵,要是需要关联矩阵的值为评分聚合结果,可参考以下两种实现方式:
方法1:通过加权关联矩阵构建(适配graph_from_incidence_matrix用法)
使用xtabs函数可以直接生成按指定指标聚合的加权关联矩阵,代码如下:
# 加载igraph包 library(igraph) # 原始数据 episodes <- data.frame( director = c("name1","name1","name1", "name1", "name2","name3", "name3"), writer = c("name4", "name5", "name4", "name6", "name6", "name7", "name4"), rating = c(7.5,8.5,7,9,9,6,9) ) # 生成加权关联矩阵,FUN参数指定评分的聚合规则:sum是求和,mean是取均值,max是取最高评分 incidence_mat <- xtabs(rating ~ director + writer, data = episodes, FUN = sum) # 构建二部加权网络 g <- graph_from_incidence_matrix(incidence_mat, weighted = TRUE, directed = FALSE) # 验证边权重是否正确 E(g)$weight
该方法生成的是二部网络,节点自动带有type属性:TRUE对应行(导演),FALSE对应列(编剧),方便后续区分节点样式。
方法2:直接通过边列表构建(更灵活无需转换矩阵)
如果不需要关联矩阵作为中间结果,可以直接把原始数据转换为边列表构建网络,代码更简洁:
library(igraph) # 直接从数据框的导演、编剧列构建无向网络 g <- graph_from_data_frame(episodes[,c("director","writer")], directed = FALSE) # 给边添加评分权重属性 E(g)$weight <- episodes$rating # 若同一个导演和编剧有多部合作作品,可合并边并聚合评分,下面的sum可替换为mean/max g <- simplify(g, edge.attr.comb = list(weight = "sum"))
权重可视化示例
绘图时可直接将权重映射为边的粗细、标签:
# 给节点设置分类颜色:导演橙色,编剧浅蓝色(方法2可自行根据节点所属类别调整判断规则) V(g)$color <- ifelse(V(g)$type, "orange", "lightblue") plot(g, edge.width = E(g)$weight, # 边的粗细对应评分高低 edge.label = E(g)$weight, # 边显示具体评分值 vertex.label.cex = 0.8)
注意事项
- 同一导演和编剧有多部合作作品时,可根据需求调整评分的聚合规则,替换代码中的
sum为mean/max即可 - 不需要展示权重数值可以删除
edge.label参数
内容的提问来源于stack exchange,提问作者RanaBraeuNerd
相关产品推荐
相关产品推荐

