二分图中的节点顺序

问题描述 投票:0回答:1

我有以下邻接矩阵“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

我们如何使用上面的节点排序来制作图形?

r igraph bipartite
1个回答
1
投票

因此,包括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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.