2012-12-19 10 views
25

Sto provando a costruire grafici usando dati ad albero, dove i nodi tipicamente si dividono in> 2 bordi. Ho provato vari layout e vedo che il parametro layout.reingold.tilford genererà grafici ad albero con dati non biforcati. Tuttavia le uscite non sono particolarmente attraenti. Preferirei usare qualcosa come layout.lgl o layout.kamada.kawai poiché producono più strutture radiali. Non riesco a vedere come modificare i parametri in R in modo tale che questi alberi non abbiano bordi sovrapposti. È possibile?Quale layout dovrei usare per ottenere bordi non sovrapposti in igraph?

Ho importato un file di dati semplice in formato Pajek, con 355 nodi e 354 spigoli. Sono in corso di stampa utilizzando:

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

Questo mi dà un output come questo, che è bello, ma ha ancora lembi sovrapposti. Ho letto che puoi aggiustarlo manualmente usando tkplot, o un altro programma come cytoscape, ma ho un bel po 'di questi da costruire, e la loro dimensione rende la correzione manuale una seccatura.

Molte grazie. Here is an example of the output I get

risposta

11

layout.reingold.tilford ha un parametro chiamato circular. Impostando questo su TRUE, il layout finale verrà convertito in uno radiale trattando la coordinata X come l'angolo (dopo la ridimensionamento appropriato) e la coordinata Y come il raggio. Ironia della sorte, questo non garantisce che non ci saranno incroci tra archi alla fine, ma funziona bene se i vostri sottostrutture non sono eccessivamente ampia rispetto al resto del grafico:

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

si consiglia di provare layout.fruchterman.reingold() . Sembra fare un buon lavoro mantenendo i bordi dall'incrocio. L'ho provato con una versione a 355 nodi del grafico barabasi suggerito da @ 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

Messaggio di avviso: In layout_with_fr (lista (355, FALSE, c (1, 2, 3, 4, 5, 6, 7, 8, 9,: Argomento 'area 'è obsoleto e non ha alcun effetto – EngrStudent

+0

@bdemarest: Hai qualche suggerimento su cosa usare invece dell'argomento" area ", per favore?" Area "è deprecato e non posso riprodurre la tua soluzione in questo momento. Grazie per idee! – nilsole

+0

'? layout_with_fr' coolexp, maxdelta, area, repulserad \t Questi argomenti non sono supportati da igraph versione 0.8.0 e vengono ignorati (con un avviso). – pengchy

16

semplicemente si vuole aggiungere un commento, ma il mio rappresentante è troppo bassa. Il metodo che @bdemarest ha pubblicato non funziona sulla versione igraph> 0,7. La versione più recente non supporta il parametro area, quindi non posso ottenere lo stesso effetto. E ottenere la vecchia versione per la compilazione mi ha richiesto un po 'di tempo, quindi ho pensato di condividere alcune intuizioni. È possibile installare manualmente igraph 0,7 dal sorgente se lo si scarica da igraph nightly builds. Sulla mia macchina (Mac OS 10.10), ho riscontrato alcuni problemi nella sua creazione, a causa di gfortran, quindi ho trovato this link che ha risolto il problema. Spero che aiuti chiunque voglia creare grafici simili in R.

+1

Ti ha dato un po 'di pronti per la vendita ... :) – Aminadav