¿Qué diseño debo usar para obtener bordes no superpuestos en igraph?


Estoy tratando de construir gráficos usando datos tipo árbol, donde los nodos típicamente se dividen en >2 bordes. He probado varios diseños, y veo que el diseño.reingold.el parámetro tilford generará gráficos tipo árbol con datos no bifurcados. Sin embargo, los resultados no son particularmente atractivos. Prefiero usar algo como el diseño.lgl o layout.kamada.kawai ya que estos producen más estructuras radiales. No puedo ver cómo cambiar los parámetros en R tal que estos árboles no tienen sin embargo, los bordes se superponen. Es esto posible?

Importé un archivo de datos simple en formato Pajek, con 355 nodos y 354 bordes. Actualmente lo estoy imprimiendo usando:

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

Esto me da una salida como esta, que es agradable, pero todavía tiene bordes superpuestos. He leído que puedes arreglar esto manualmente usando tkplot, u otro programa como cytoscape, sin embargo tengo bastantes de estos para construir, y el tamaño de ellos hace que la corrección manual sea una molestia.

Muchas gracias. Aquí hay un ejemplo de la salida que obtengo

Author: Marcus Shepheard, 2012-12-20

3 answers

layout.reingold.tilford tiene un parámetro llamado circular. Establecer esto en TRUE convertirá el diseño final en uno radial al tratar la coordenada X como el ángulo (después del reajuste apropiado) y la coordenada Y como el radio. Irónicamente, esto no garantiza que no habrá cruces de bordes al final, pero funciona muy bien si sus subárboles no son excesivamente amplios en comparación con el resto del gráfico:

> g <- barabasi.game(100, directed=F)
> layout <- layout.reingold.tilford(g, circular=T)
> plot(g, layout=layout)
 12
Author: Tamás,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-20 18:55:17

Es posible que desee probar layout.fruchterman.reingold(). Parece hacer un buen trabajo evitando que los bordes se crucen. Lo he probado con una versión de 355 nodos del gráfico barabasi sugerido por @ 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()

introduzca la descripción de la imagen aquí

 18
Author: bdemarest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-21 06:49:58

Solo quiero agregar un comentario, pero mi reputación es demasiado baja. El método que @ bdemarest publicó no funciona en igraph versión > 0.7. La versión más reciente no admite el parámetro area, por lo que no puedo obtener el mismo efecto. Y conseguir la versión antigua para construir me llevó un tiempo, así que pensé en compartir algunas ideas. Puede instalar manualmente igraph 0.7 desde el código fuente si lo descarga desde igraph nightly builds. En mi máquina (Mac OS 10.10), me encontré con algunos problemas de construcción, debido a gfortran, así que encontré este enlace que resolvió el problema. Espero que eso ayude a cualquiera que quiera crear gráficos similares en R.

 17
Author: morphe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-22 11:31:41