Какую макет следует использовать для получения неперекрывающихся ребер в 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]()
Ответы
Ответ 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.