Какой макет я должен использовать, чтобы получить неперекрывающиеся края в igraph?
Я пытаюсь построить графики, используя древовидные данные, где узлы обычно разделяются на>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, однако у меня есть довольно много таких программ, и их размер затрудняет ручную коррекцию.
Большое спасибо.
3 ответа
layout.reingold.tilford
имеет параметр с именем circular
, Установка этого в TRUE
преобразует окончательный макет в радиальный, обрабатывая координату X как угол (после соответствующего масштабирования) и координату Y как радиус. Как ни странно, это не гарантирует, что в конце не будет пересечений ребер, но это хорошо работает, если ваши поддеревья не слишком широки по сравнению с остальной частью графика:
> g <- barabasi.game(100, directed=F)
> layout <- layout.reingold.tilford(g, circular=T)
> plot(g, layout=layout)
Просто хочу добавить комментарий, но моя репутация слишком низкая. Метод, который опубликовал @bdemarest, не работает igraph
версия> 0.7. Более новая версия не поддерживает area
параметр, поэтому я не могу получить тот же эффект. И получение старой версии для сборки заняло у меня некоторое время, поэтому я решил поделиться некоторыми соображениями. Вы можете установить вручную igraph
0.7 из исходного кода, если вы загрузите его из ночных сборок igraph. На моей машине (Mac OS 10.10) я столкнулся с некоторыми проблемами при его сборке из-за gfortran
, так что я нашел эту ссылку, которая решила проблему. Надеюсь, что это поможет любому, кто хочет создавать подобные графики в R.
Вы можете попробовать layout.fruchterman.reingold()
, Кажется, что он хорошо справляется с защитой от пересечения краев. Я протестировал его с версией графа Барабаси на 355 узлов, предложенной @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()