二部图中的节点顺序

时间:2018-10-17 14:25:18

标签: r igraph bipartite

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

我们如何制作具有上述节点顺序的图?

1 个答案:

答案 0 :(得分:1)

因此igraphlayout.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