如何在R的igraph中旋转边标签使其与边方向一致?
解决igraph边标签与边方向对齐的问题
要实现边标签与边方向一致的效果,igraph默认plot()函数没有直接参数支持,需要手动计算每条边的角度,再通过text()函数添加旋转后的标签。以下是修改后的完整代码:
library(igraph) ### 数据准备 id <- c("CO1", "CO2", "CO3", "CO4", "CO5", "CO6", "CO7") id.type <- c("0", "1", "1", "0", "0", "1", "0") y <- c("0", "7.2", "-0.8", "7", "6.8", "2", "-1") x <- c("-0.25", "-4", "-2.5", "-4", "-4", "-0.5", "-2.2") nodes <- data.frame(id=id, id.type=id.type, id_y=y, id_x=x) from <- c("CO1", "CO2", "CO1", "CO3", "CO4", "CO1", "CO6") to <- c("CO5", "CO1", "CO6", "CO7", "CO2", "CO4", "CO7") l <- c("1.1.1.34; 1.1.1.88", "1.13.11.3", "2.3.3.9", "2.1.1.6", "6.3.2.1", "2.6.1.44; 2.6.1.45", "4.4.5.7") w1 <- c(296.06,30.88,476.31,120.51,206.6,260.56,160.56) links <- data.frame(from=from, to=to, type=l, weight=w1) # 简化weight定义,避免数组维度问题 ### 创建网络图 net <- graph_from_data_frame(d=links, vertices=nodes, directed=T) l <- layout_as_tree(net) l <- norm_coords(l, ymin=-2, ymax=8.5, xmin=-5.5, xmax=2.5) # 先绘制网络图,不显示默认边标签 plot(net, layout=l, edge.arrow.size=abs(log(links$weight,120))*1.3, edge.label=NA, # 关闭默认标签 edge.label.cex=abs(log(links$weight,120))*0.8, edge.width=abs(log(links$weight,120))*5) # 计算每条边的角度并添加旋转后的标签 for(i in 1:nrow(links)){ # 获取起点和终点的坐标 from_node <- which(V(net)$name == links$from[i]) to_node <- which(V(net)$name == links$to[i]) x_from <- l[from_node, 1] y_from <- l[from_node, 2] x_to <- l[to_node, 1] y_to <- l[to_node, 2] # 计算边的中点坐标(标签放置位置) x_mid <- (x_from + x_to)/2 y_mid <- (y_from + y_to)/2 # 计算旋转角度(弧度转度数,调整标签方向) angle <- atan2(y_to - y_from, x_to - x_from) * 180 / pi # 当角度大于90或小于-90时,旋转180度让文字正读 if(angle > 90 || angle < -90){ angle <- angle + 180 } # 添加旋转后的标签 text(x_mid, y_mid, labels=links$type[i], cex=abs(log(links$weight[i],120))*0.8, srt=angle) # srt参数控制文字旋转角度 }
关键步骤说明
- 关闭默认标签:在
plot()中设置edge.label=NA,避免重复绘制标签。 - 计算边的角度:用
atan2()计算边的方向弧度,转换为度数后,调整角度确保文字始终正向可读(避免倒转)。 - 放置标签位置:取边的中点作为标签位置,也可根据需要微调(比如向边的外侧偏移一点)。
- 匹配原样式:保持
cex参数和原代码一致,确保标签大小和边的权重关联。
内容的提问来源于stack exchange,提问作者yan wang
相关产品推荐
相关产品推荐

