igraph可视化:如何按Barycenter Centrality四分位数为节点上色?
基于Barycenter Centrality为igraph节点分区间着色的实现方案
网络结构信息
我正在处理一个包含21个节点和44条带权边的连通网络,网络结构如下:
> E(G.final) + 44/44 edges from cc34dce (vertex names): [1] N --M N --LS N --BT N --T N --P N --B N --E N --JL AN--A PR--P JB--J JB--L. JB--LC JB--S M --LS M --T M --B [18] M --E M --JL J --BT J --V J --C J --P J --G J --B J --S BT--V BT--A BT--C BT--P BT--S BT--AL V --C V --P [35] V --AL L.--S T --B T --E A --C C --B C --S C --AL B --E B --S > V(G.final) + 21/21 vertices, named, from cc34dce: [1] N AN PR JB M LS J BT V L. LC T A C P G B E S AL JL
已完成的节点大小调整
此前已成功根据Current-Flow Closeness Centrality调整节点大小,实现代码:
centrality <- calculate_centralities(G.final, include = "Current-Flow Closeness Centrality") V(G.final)$attribut.centrality <- unlist(centrality, use.names = T) V(G.final)$attribut.centrality plot(G.final,layout = layout_with_fr,vertex.color = "grey", edge.color = "black", vertex.label.family = "Times", vertex.label.color="black")
需求:基于Barycenter Centrality分区间着色
已完成Barycenter Centrality指标计算并设为节点属性:
info.centrality <- calculate_centralities(G.final, include = "Barycenter Centrality") V(G.final)$attribut.info_centrality <- unlist(info.centrality, use.names = T) V(G.final)$attribut.info_centrality summary(V(G.final)$attribut.info_centrality)
需要按以下逻辑为节点分配颜色:
- 指标值小于第一四分位数:一种颜色
- 指标值介于第一和第三四分位数之间:一种颜色
- 指标值大于等于第三四分位数:一种颜色
此前用cartography和igraph实现了效果,但美观度欠佳。
实现方案
可以直接通过quantile()函数提取四分位数,结合cut()函数创建分组,再映射颜色,代码如下:
# 提取Barycenter Centrality的第一和第三四分位数 q_vals <- quantile(V(G.final)$attribut.info_centrality, c(0.25, 0.75)) # 根据区间创建分组变量 V(G.final)$color_group <- cut( V(G.final)$attribut.info_centrality, breaks = c(-Inf, q_vals[1], q_vals[2], Inf), labels = c("low", "mid", "high") ) # 定义颜色映射(可根据需求替换成更美观的配色) color_map <- c("low" = "#6baed6", "mid" = "#9ecae1", "high" = "#2171b5") # 绘制图形,同时结合之前的节点大小设置(可通过rescale调整节点大小范围) plot(G.final, layout = layout_with_fr, vertex.color = color_map[V(G.final)$color_group], vertex.size = scales::rescale(V(G.final)$attribut.centrality, to = c(5, 20)), # 调整节点大小范围 edge.color = "gray80", # 弱化边的颜色突出节点 vertex.label.family = "Times", vertex.label.color = "black", vertex.label.cex = 0.8, # 调整标签大小 edge.width = 0.8 # 调整边宽 ) # 添加图例 legend("bottomright", legend = c("小于第一四分位数", "介于第一-第三四分位数", "大于等于第三四分位数"), fill = color_map, cex = 0.7, title = "Barycenter Centrality" )
说明
- 使用
quantile()直接从指标值中提取四分位数,避免手动输入,保证准确性; cut()函数自动将指标值分到三个区间,生成分组变量;- 配色选用了更专业的蓝色系(可替换为其他配色,比如
c("low" = "#e41a1c", "mid" = "#ffff33", "high" = "#4daf4a")); - 通过
scales::rescale()统一节点大小的显示范围,避免过大或过小; - 调整边的颜色、宽度和标签大小,提升整体美观度。
内容的提问来源于stack exchange,提问作者NA_
相关产品推荐
相关产品推荐

