2016-02-18 3 views
1

У меня случайный граф g и его нужно разбить на два разделенных графика g1 и g2 с правилом. Правило разделения - двоичная матрица E: если (E [i, j] = 1), то переместите соответствующий узел на график g1, иначе переместите соответствующий узел на график g2. После разделения мне нужно построить три графика на экране. Я использую 1s из матрицы E, чтобы определить положение узлов из графика g1 на участке (то есть mylayout1). Мой код показан ниже.R: как определить расположение макета узлов

library(igraph) 
set.seed(42) 
n <- m <- 5 
B <- matrix(sample(0:255, (n*m)^2, replace=T), nrow = n*n, ncol = m*m) 
g <- graph.adjacency(B, weighted=TRUE, mode="undirected", diag=FALSE) 
V(g)$name <- as.character(1:(n*m)) 
E <- matrix(sample(0:1, n*m, replace=T), nrow = m, ncol = n) 

# split into two graphs, if (E[i,j]=1) then the node move to g1, else to g2 

vsubgraph <- c(1:length(E))*E 
vsubgraph <- vsubgraph[vsubgraph != 0] 

g1 <- induced_subgraph(g, vsubgraph) 
g2 <- induced_subgraph(g, setdiff(V(g), vsubgraph)) 

V(g)[vsubgraph]$color <- "green" 
V(g)[setdiff(V(g), vsubgraph)]$color <- "yellow" 

V(g1)$name <- vsubgraph 
V(g2)$name <- setdiff(V(g), vsubgraph) 

V(g1)$color <- "green" 
V(g2)$color <- "yellow" 

par(mfrow=c(1,3)) 

# create layout 
cx <-rep(1:n, each = m) 
cy <-rep(c(1:m), times = n) 

mylayout <- as.matrix(cbind(cx, -cy)) 

plot(g, layout=mylayout, 
      vertex.shape = "square", 
      vertex.label = V(g)$name, 
      edge.label.cex=.75, 
      xlab='Original graph' 
    ) 

cx <- cx * E 
cy <- cy * E 

cx <- cx[cx != 0] 
cy <- cy[cy != 0] 

mylayout1 <- as.matrix(cbind(cx, -cy)) 

plot(g1, layout=mylayout1, 
      vertex.shape = "square", 
      vertex.label = V(g)$name, 
      edge.label.cex=.75, 
      xlab='1st graph' 
    ) 
plot(g2, #layout=mylayout2, 
      vertex.shape = "square", 
      vertex.label = V(g)$name, 
      edge.label.cex=.75, 
      xlab='2nd graph' 
    ) 

Может кто-то пожалуйста, дать представление о том, как определить mylayout2 для второго графа g2? Я хотел бы использовать исходное положение узлов из mylayout. Одним из решений может быть также используемая матрица E. К сожалению, я не могу понять, как использовать 0s из матрицы E.

ответ

0

Одним из возможных способов является:

opE <- ifelse(E == 0, 1, 0) 

cx <-rep(1:n, each = m) 
cy <-rep(c(1:m), times = n) 

cx <- cx * opE 
cy <- cy * opE 

cx <- cx[cx != 0] 
cy <- cy[cy != 0] 

mylayout2 <- as.matrix(cbind(cx, -cy)) 

plot(g2, layout=mylayout2, 
      vertex.shape = "square", 
      vertex.label = V(g)$name, 
      edge.label.cex=.75, 
      xlab='2nd graph' 
    ) 
Смежные вопросы