2012-12-19 3 views
25

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

Я импортировал простой файл данных в формате 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

ответ

11

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

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

Вы можете захотеть попробовать 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() 

enter image description here

+3

Предупреждающее сообщение: В layout_with_fr (список (355, FALSE, c (1, 2, 3, 4, 5, 6, 7, 8, 9,: Аргумент 'area 'устарел и не имеет эффекта – EngrStudent

+0

@bdemarest: Есть ли у вас какие-либо предложения по использованию вместо аргумента« area », пожалуйста?« Area »устарел, и я не могу воспроизвести ваше решение прямо сейчас. для идей! – nilsole

+0

'? layout_with_fr' coolexp, maxdelta, area, repulserad \t Эти аргументы не поддерживаются с версии igraph 0.8.0 и игнорируются (с предупреждением). – pengchy

16

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

+1

Дал вам некоторую репо ... :) – Aminadav