2017-01-22 2 views
0

Я хотел бы передать igraph матрицу из ряда ребер, чтобы она образовывалась между узлами. Края неориентированы. Однако, это не добавляет края, я хотел бы, чтобы он добавитьдобавление нескольких граней одновременно к графику с использованием igraph

мой график выглядит как этот

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 

теперь я хочу, чтобы добавить эти неориентированных края (ребра в m идут горизонтально, например, 12--13 ребро , 9--13 - это край и т. Д.). Если ребра повторяются, они должны быть удалены, поскольку они ненаправлены (это означает, что 23--20 совпадает с 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 

когда я

add_edges(mygraph, m) 

я получаю следующее (обратите внимание, общее число ребер является правильным, но не узлы, которые должны иметь края. Например, 12--13 не существует, и вместо 12--9, который не указан в m). Похоже, что add_edges добавляет ребро вертикально, чтобы сделать 12--9, а не горизонтально, чтобы сделать 12--13 от 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 

, как ребра могут быть добавлены в горизонтальном направлении от матрицы к графу с использованием igraph?

ответ

1

Вам нужно сделать транспонирование своей краевой матрицы, прежде чем добавлять их в свой график, причина в том, что данные в матрице хранятся в столбце, и кажется, что igraph не обеспечивает надлежащего интерфейса для матрицы, он не интерпретирует вашу матрицу, как по ряду края матрицы, но только вектор и интерпретировать каждую смежную пару в качестве нового ребра:

Взгляните на этом простом примере:

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 

Если добавить м непосредственно к объекту графика:

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

У меня 6 -> 4 и 2 -> 5 добавленных в качестве графа, который из-за:

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

Таким образом, соседние узлы интерпретируются как края. Но если вы переставляете m перед добавлением его в виде ребер, он дает правильный результат.

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