2012-02-26 3 views
6

Я пытаюсь нарисовать график, где расстояние между вершинами соответствует весам краев *, и я нашел, что в графике существует способ рисовать такой график. Есть ли способ сделать это в R с пакетом igraph (specfically с graph.adkacency)?Визуализация расстояния между узлами в соответствии с весами - с R

Спасибо,

Ноам

ответ

4

Это невозможно, так как вам нужно треугольник равенство для каждого треугольника, чтобы иметь возможность построить такие объект. Поэтому вы можете только приблизиться к нему. Для этого вы можете использовать «принудительные встроенные» алгоритмы. В играфе есть несколько. Я часто использую алгоритм Фрухтермана-Рейнгольда.

Смотрите подробности:

library("igraph") 
?layout.fruchterman.reingold 

Edit:

Обратите внимание, что расстояние между узлами будет соответствовать несколько с обратной абсолютной массы края.

3

Как упоминалось в Sacha Epskamp, ​​если только ваши данные не идеальны, вы не можете нарисовать график, который бы не нарушал некоторые треугольные неравенства. Однако существуют методы, называемые Multidimensional scaling (MDS), предназначенные для минимизации таких нарушений.

Одна реализация в R cmdscale от stats упаковка. Я рекомендовал бы пример в нижней части ?cmdscale:

> require(graphics) 
> 
> loc <- cmdscale(eurodist) 
> x <- loc[,1] 
> y <- -loc[,2] 
> plot(x, y, type="n", xlab="", ylab="", main="cmdscale(eurodist)") 
> text(x, y, rownames(loc), cex=0.8) 

Конечно, вы можете построить x и y с использованием любых графических пакетов (вы вопросительно о igraph специально).

Наконец, я уверен, что вы найдете множество других реализаций, если будете искать «многомерное масштабирование» или «MDS». Удачи.

+2

Также обратите внимание, что в 'igraph' есть функция, называемая' layout.mds', которая, как представляется, выполняет MDS на матрице полного расстояния, чтобы получить координаты компоновки. –

Смежные вопросы