如何解决设置网络圆图的方向为顺时针
我在下面的图表中总是在顶部显示节点 a
。我想改变的是用 igraph
改变圆形网络的方向总是正确的(顺时针)。这是一个基于 Set the position of certain node always on top of ring graph
library('igraph')
nodes <- c('a','b','c','d')
x <- c(0,1,2,3)
y <- c(0,3)
from <- c('a','d')
to <- c('b','d','a')
NodeList <- data.frame(nodes,x,y)
EdgeList <- data.frame(from,to)
a<- graph_from_data_frame(vertices = NodeList,d= EdgeList,directed = TRUE)
# rotate rows of matrix mat so that row number mx is at top
# where mx defaults to row having largest value in 2nd column
rot <- function(mat,mx = which.max(mat[,2])) {
if (mx == 1) mat else mat[c(mx:nrow(mat),1:(mx-1)),]
}
plot(a,layout = rot(layout_in_circle(a)))
解决方法
ggraph
默认执行此操作
library(ggraph)
ggraph(a,layout = 'linear',circular = TRUE) +
geom_edge_link(arrow = arrow(length = unit(4,'mm')),end_cap = circle(4,'mm')) +
geom_node_label(aes(label = name)) +
coord_fixed()
您也可以手动设置位置:
library(ggraph)
library(tidygraph)
a %>%
as_tbl_graph() %>%
mutate(
alpha = pi/2 - 0:(gsize(a) - 1)*2*pi/gsize(a),x = cos(alpha),y = sin(alpha)
) %>%
ggraph(x = x,y = y) +
geom_edge_link(arrow = arrow(length = unit(4,'mm')) +
geom_node_label(aes(label = name)) +
coord_fixed()
,
您可以使用 order
参数确定方向:
plot(a,layout = rot(layout_in_circle(a,order = order(from,decreasing = T))))
请注意,
order(from,decreasing =T)
在这里有效,因为节点名称按字母顺序递增。
如需更通用的解决方案,请参阅 this post。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。