Подтвердить что ты не робот

Какую макет следует использовать для получения неперекрывающихся ребер в igraph?

Я пытаюсь построить графики, используя древовидные данные, где узлы обычно разбиваются нa > 2 ребра. Я пробовал различные макеты, и я вижу, что параметр layout.reingold.tilford будет генерировать древовидные графики с небиффицирующими данными. Однако результаты не особенно привлекательны. Я бы предпочел использовать что-то вроде layout.lgl или layout.kamada.kawai, поскольку они создают более радиальные структуры. Я не вижу, как изменить параметры в R, так что эти деревья не имеют перекрывающихся ребер. Возможно ли это?

Я импортировал простой файл данных в формате Pajek, с 355 узлами и 354 ребрами. В настоящее время я печатаю его, используя:

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

Это дает мне такой результат, который хорош, но все же имеет перекрывающиеся края. Я прочитал, что вы можете вручную исправить это с помощью tkplot или другой программы, такой как cytoscape, однако у меня их довольно много, и их размер затрудняет ручную коррекцию.

Большое спасибо. Here is an example of the output I get

4b9b3361

Ответ 1

layout.reingold.tilford имеет параметр circular. Установка этого параметра на TRUE преобразует окончательный макет в радиальный, обрабатывая координату X как угол (после соответствующего масштабирования) и координату Y как радиус. Как ни странно, это не гарантирует, что в конце не будет пересечений кромок, но он работает хорошо, если ваши поддеревья не являются чрезвычайно широкими по сравнению с остальной частью графика:

> g <- barabasi.game(100, directed=F)
> layout <- layout.reingold.tilford(g, circular=T)
> plot(g, layout=layout)

Ответ 2

Вы можете попробовать layout.fruchterman.reingold(). Кажется, он хорошо справляется с тем, чтобы края не пересекались. Я протестировал его с помощью 355 node версии графика барабаши, предложенного @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()

enter image description here

Ответ 3

Просто хочу добавить комментарий, но моя репутация слишком низкая. Метод, который опубликовал @bdemarest, не работает в версии igraph версии 0.7. Более новая версия не поддерживает параметр area, поэтому я не могу получить тот же эффект. И получение старой версии для сборки заняло у меня некоторое время, поэтому я бы поделился некоторыми сведениями. Вы можете вручную установить igraph 0.7 из исходного кода, если вы загрузите его из igraph ночной сборки. На моей машине (Mac OS 10.10) у меня возникли проблемы с ее созданием из-за gfortran, поэтому я нашел эту ссылку, которая решила проблему, Надеюсь, что это поможет любому, кто хочет создать похожие графики в R.