Którego układu powinienem użyć, aby uzyskać nie nakładające się krawędzie w igraph?

Próbuję zbudować wykresy używając danych drzewiastych, gdzie węzły zazwyczaj dzielą się na > 2 krawędzie. Próbowałem różnych układów i widzę, że układ.reingold.parametr tilforda wygeneruje wykresy przypominające drzewo z danymi nie rozwidlającymi się. Wyniki nie są jednak szczególnie atrakcyjne. Wolałbym użyć czegoś takiego jak układ.lgl lub layout.kamada.kawai, ponieważ wytwarzają one więcej struktur promieniowych. Nie widzę jak zmienić parametry w R tak aby te drzewa nie miały nakładające się krawędzie. Czy to możliwe?

Zaimportowałem prosty plik danych w formacie Pajek, z 355 węzłami i 354 krawędziami. Obecnie drukuję go używając:

plot.igraph(g,vertex.size=3,vertex.label=NA,layout=layout.lgl)

To daje mi takie wyjście, które jest ładne, ale nadal ma nakładające się krawędzie. Przeczytałem, że można to ręcznie naprawić za pomocą tkplot, lub innego programu, takiego jak cytoscape, jednak mam sporo z nich do zbudowania, a ich rozmiar sprawia, że ręczna korekta jest kłopotliwa.

Wielkie dzięki. Oto przykład wyjścia, które otrzymuję
Author: Marcus Shepheard, 2012-12-20

3 answers

layout.reingold.tilford posiada parametr o nazwie circular. Ustawienie tej wartości na TRUE przekształci końcowy układ w Promień, traktując współrzędną X jako kąt (po odpowiednim przeskalowaniu), a współrzędną Y jako promień. Jak na ironię, nie gwarantuje to, że w końcu nie będzie żadnych przekroczeń krawędzi, ale działa to ładnie, jeśli Twoje podtypy nie są zbyt szerokie w porównaniu do reszty wykresu: {]}

> g <- barabasi.game(100, directed=F)
> layout <- layout.reingold.tilford(g, circular=T)
> plot(g, layout=layout)
 12
Author: Tamás,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-20 18:55:17

Możesz spróbować layout.fruchterman.reingold(). Wygląda na to, że dobrze trzyma krawędzie przed przekroczeniem. Testowałem go z 355-węzłową wersją grafu barabasi sugerowanego przez @ Tamás.

library(igraph)

g = barabasi.game(355, directed=FALSE)

png("plot1.png", height=6, width=12, units="in", res=200)
par(mfrow=c(1, 2))

plot.igraph(g,vertex.size=3,vertex.label=NA,
    layout=layout.fruchterman.reingold(g, niter=10000))
mtext("layout.fruchterman.reingold, area = vcount^2", side=1)

plot.igraph(g,vertex.size=3,vertex.label=NA,
    layout=layout.fruchterman.reingold(g, niter=10000, area=30*vcount(g)^2))
mtext("layout.fruchterman.reingold, area = 30 * vcount^2", side=1)

dev.off()

Tutaj wpisz opis obrazka

 18
Author: bdemarest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-21 06:49:58

Chcę tylko dodać komentarz, ale moja reputacja jest za niska. Metoda, którą opublikował @bdemarest, nie działa na igraph version > 0.7. Nowsza wersja nie obsługuje parametru area, więc nie mogę uzyskać tego samego efektu. I uzyskanie starej wersji do budowy Zajęło mi trochę czasu, więc pomyślałem, że podzielę się kilkoma spostrzeżeniami. Możesz ręcznie zainstalować igraph 0.7 ze źródła, jeśli pobierzesz go z igraph nightly builds. Na moim komputerze (Mac OS 10.10) napotkałem pewne problemy z jego budową, ze względu na gfortran, więc znalazłem ten link który rozwiązał problem. Nadzieję, że pomoże to każdemu, kto chce tworzyć podobne wykresy w R.

 17
Author: morphe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-22 11:31:41