2017-01-22 1 views
0

Je voudrais passer igraph une matrice d'une série d'arêtes pour qu'il se forme entre les nœuds. Les bords sont non dirigés. Cependant, il n'ajoute les bords, je voudrais que pour ajouteren ajoutant plusieurs bords simultanément à un graphique en utilisant igraph

mon graphique ressemble à ceci

mygraph 
IGRAPH U--- 30 11 -- 
+ attr: color (v/c), color (e/c) 
+ edges: 
[1] 3-- 4 3-- 9 4-- 5 4-- 6 6--10 12--14 15--20 16--21 25--27 25--30 26--29 

Je veux maintenant ajouter ces bords non orientés (bords en m vont horizontalement par exemple 12--13 est une arête , 9--13 est un bord, etc). Si les bords se répètent, ils doivent être supprimés car ils ne sont pas dirigés (ce qui signifie 23--20 est identique à 20--23).

m 
    value L1 
[1,]  6 2 
[2,]  4 5 
[3,]  6 5 
[4,]  2 6 
[5,] 12 13 
[6,]  9 13 
[7,] 23 20 
[8,] 20 23 

quand je fais

add_edges(mygraph, m) 

je reçois les éléments suivants (note, le nombre total d'arêtes est correct, mais pas les nœuds qui devrait avoir des bords. Par exemple, 12--13 n'existe pas et au lieu 12--9 est formé, ce qui n'était pas spécifié dans m). Il semble que add_edges est l'ajout d'un bord verticalement pour faire 12--9 au lieu de horizontalement pour faire 12--13 de m

IGRAPH U--- 30 19 -- 
+ attr: color (v/c), color (e/c) 
+ edges: 
[1] 3-- 4 3-- 9 4-- 5 4-- 6 6--10 12--14 15--20 16--21 25--27 25--30 26--29 4-- 6 2-- 6 9--12 20--23 2-- 5 5-- 6 13--13 
[19] 20--23 

comment les bords peuvent être ajoutés horizontalement à partir d'une matrice à un graphique à l'aide igraph?

Répondre

1

Vous devez faire une transposition de votre matrice de bord avant de les ajouter à votre graphique, la raison est que les données dans une matrice sont stockées par colonne, et il semble que igraph ne fournit pas une interface correcte pour la matrice, c.-à-d. il n'interprète pas votre matrice comme par matrice de bord de ligne, mais juste un vecteur et interpréter chaque paire adjacente comme un nouveau bord:

Jetez un oeil à cet exemple simple:

library(igraph) 
mygraph <- graph(c(1,2,3,4,5,6)) 
mygraph 
IGRAPH D--- 6 3 -- 
+ edges: 
[1] 1->2 3->4 5->6 

m <- matrix(c(6,2,4,5), byrow = TRUE, ncol = 2) 
m 
    [,1] [,2] 
[1,] 6 2 
[2,] 4 5 

Si j'ajoute m directement vers l'objet graphique:

add_edges(mygraph, m) 
IGRAPH D--- 6 5 -- 
+ edges: 
[1] 1->2 3->4 5->6 6->4 2->5 

I ont 6 -> 4 et 2 -> 5 ajouté sous forme graphique, ce qui est dû au fait:

as.vector(m) 
# [1] 6 4 2 5 

noeuds adjacents Ainsi sont interprétés comme des bords. Mais si vous transposez m avant de l'ajouter en tant que bords, cela donne le résultat correct.

add_edges(mygraph, t(m)) 
IGRAPH D--- 6 5 -- 
+ edges: 
[1] 1->2 3->4 5->6 6->2 4->5