如何避免igraph绘制有向图时出现双向边箭头重叠问题
R语言igraph绘制加权有向图解决双向边重叠方案
双向边重叠是igraph默认使用直边绘制导致的,互反的两条边会完全重合,仅显示为双箭头。可以通过调整边的曲率参数实现双向边分离显示。
解决方案1:全局统一设置边曲率
最简单的方案是在plot()函数中添加edge.curved参数,设置0.1~0.3的曲率值即可让双向边自然错开:
library(igraph) actors <- data.frame(name=c("a","b","c","d","e","f","g","h")) relations <- data.frame(from=c("a", "a", "b", "b", "b", "c", "d","d", "g","e","g","d"), to =c("d", "e", "c", "e", "g", "f", "f", "g", "h","b","d","a"), weight = c(14,30,25,3,5,6,4,13,2,6,10,10)) g <- graph_from_data_frame(relations, directed=TRUE, vertices=actors) test.layout <- layout_(g,with_dh(weight.edge.lengths = edge_density(g)/1000)) # 新增edge.curved参数设置曲率 plot(g,vertex.size=30,edge.arrow.size= 0.5,edge.label = relations$weight, layout = test.layout, edge.curved = 0.2)
解决方案2:仅双向边设置曲率(更美观)
如果希望单向边保持直线、仅双向边弯曲,可以通过which_mutual()函数自动识别互反边,针对性设置曲率:
library(igraph) actors <- data.frame(name=c("a","b","c","d","e","f","g","h")) relations <- data.frame(from=c("a", "a", "b", "b", "b", "c", "d","d", "g","e","g","d"), to =c("d", "e", "c", "e", "g", "f", "f", "g", "h","b","d","a"), weight = c(14,30,25,3,5,6,4,13,2,6,10,10)) g <- graph_from_data_frame(relations, directed=TRUE, vertices=actors) test.layout <- layout_(g,with_dh(weight.edge.lengths = edge_density(g)/1000)) # 生成曲率向量,默认所有边曲率为0(直线) edge_curv <- rep(0, ecount(g)) # 给互反边设置0.2的曲率 edge_curv[which_mutual(g)] <- 0.2 plot(g,vertex.size=30,edge.arrow.size= 0.5,edge.label = relations$weight, layout = test.layout, edge.curved = edge_curv)
参数说明
- 曲率数值可根据显示效果调整,数值越大边的弯曲程度越高,通常0.1~0.3范围内视觉效果最优
- 如果边标签也出现重叠,可以配合
edge.label.cex调整标签大小,或edge.label.dist调整标签和边的距离
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

