我有以下邻接矩阵“dat”:
dat <- read.table(text = ' TZ1 TZ2 TZ3 TZ4
RSP1 0.456 0.232 0.234 0.000
RSN1 0.248 0.613 0.754 0.413
RSP2 0.206 0.000 0.493 0.000
RSN2 0.000 0.000 0.000 0.000
RSP3 0.000 0.000 0.218 0.000
RSN3 0.000 0.000 0.000 0.000
RSP4 0.000 0.000 0.000 0.851
RSN4 0.000 0.000 0.000 0.000' ) %>%
as.matrix()
并使用下面的代码来制作二分法
g<-graph_from_incidence_matrix(dat, directed = TRUE, mode = "out", multiple = FALSE, weighted = T, add.names = NULL)
V(g)$color <- ifelse(V(g)$type, "lightblue", "salmon")
V(g)$shape <- ifelse(V(g)$type, "square","circle")
V(g)$frame.color <- "gray"
V(g)$size <- 18
E(g)$color <- "blue"
plot.igraph(g, edge.width=E(g)$weight*5, layout=layout.bipartite,edge.arrow.size=0.5,
vertex.label.cex = 0.8, vertex.label.color = "black", vertex.shape=V(g)$shape, vertex.size=degree(g)*5)
然而,节点的顺序不是根据以下
RSP1 RSN1 RSP2 RSN2 RSP3 RSN3 RSP4 RSN4
和
TZ1 TZ2 TZ3 TZ4
我们如何使用上面的节点排序来制作图形?
因此,包括igraph
在内的layout.bipartite
中的许多布局函数都专注于最小化边缘交叉:
首先根据类型将顶点放在两行中来创建布局。然后优化行内的位置以最小化边缘交叉,
如果要控制节点位置,则必须通过在列中创建具有x和y位置的矩阵以及与V(g)具有相同顺序的行来进行自定义布局。 purrr
可以帮助你:
Rs <- V(g)$name[grepl('^R', V(g)$name)] %>%
purrr::imap(function(x, i){
c(i, 2)
}) %>%
do.call(rbind, .)
Ts <- V(g)$name[grepl('^T', V(g)$name)] %>%
purrr::map2(3:6, function(x, i){
c(i, 1)
}) %>%
do.call(rbind, .)
l <- rbind(Rs, Ts)
这将给你一个矩阵:
[,1] [,2]
[1,] 1 2
[2,] 2 2
[3,] 3 2
[4,] 4 2
[5,] 5 2
[6,] 6 2
[7,] 7 2
[8,] 8 2
[9,] 3 1
[10,] 4 1
[11,] 5 1
[12,] 6 1