2012-02-26 16 views

Odpowiedz

4

Nie jest to możliwe, jak trzeba równości trójkąt dla każdego trójkąta, aby móc wykreślić takie obiekt. Więc możesz to tylko przybliżić. Do tego możesz użyć algorytmów "force embedded". Jest kilka w igraph. Często używam algorytmu Fruchtermana-Reingolda.

Patrz szczegóły:

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

Edycja:

Należy zauważyć, że odległość pomiędzy węzłami odpowiadać będzie nieco z odwrotności absolutny ciężar krawędzi.

3

Tak jak wspomniał Sacha Epskamp, ​​chyba że dane są idealne, nie można narysować wykresu, który nie naruszałby niektórych nierówności trójkątnych. Istnieją jednak techniki o nazwie Multidimensional scaling (MDS), których celem jest zminimalizowanie takich naruszeń.

Jedna implementacja w R jest cmdscale z pakietu . Polecam na przykład u dołu ?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) 

Oczywiście, można wykreślić x i y używając żadnych pakietów graficznych (pan pyta o igraph specjalnie).

Wreszcie, na pewno znajdziesz wiele innych implementacji, jeśli szukasz "wielowymiarowego skalowania" lub "MDS". Powodzenia.

+2

Należy również zauważyć, że istnieje funkcja o nazwie 'layout.mds' w' igraph', która wydaje się wykonywać MDS na macierzy pełnej odległości w celu uzyskania współrzędnych układu. –

Powiązane problemy