web-dev-qa-db-fra.com

Quelle disposition dois-je utiliser pour obtenir des bords non superposés dans igraph?

J'essaie de construire des graphiques en utilisant des données arborescentes, où les nœuds se divisent généralement en> 2 bords. J'ai essayé différentes dispositions et je vois que le paramètre layout.reingold.tilford générera des graphiques arborescents avec des données non bifurquantes. Cependant, les résultats ne sont pas particulièrement attrayants. Je préfère utiliser quelque chose comme layout.lgl ou layout.kamada.kawai car ceux-ci produisent plus de structures radiales. Je ne vois pas comment changer les paramètres dans R de telle sorte que ces arbres n'aient pas de bords qui se chevauchent. Est-ce possible?

J'ai importé un simple fichier de données au format Pajek, avec 355 nœuds et 354 bords. Je l'imprime actuellement en utilisant:

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

Cela me donne une sortie comme celle-ci, qui est agréable, mais qui a toujours des bords qui se chevauchent. J'ai lu que vous pouvez résoudre ce problème manuellement à l'aide de tkplot ou d'un autre programme comme Cytoscape, mais j'en ai pas mal à construire, et leur taille rend la correction manuelle compliquée.

Merci beaucoup. Here is an example of the output I get

29
Marcus Shepheard

layout.reingold.tilford a un paramètre appelé circular. La définition de TRUE convertira la disposition finale en une disposition radiale en traitant la coordonnée X comme l'angle (après une mise à l'échelle appropriée) et la coordonnée Y comme le rayon. Ironiquement, cela ne garantit pas qu'il n'y aura pas de croisements de bord à la fin, mais cela fonctionne bien si vos sous-arbres ne sont pas excessivement larges par rapport au reste du graphique:

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

Je veux juste ajouter un commentaire, mais mon représentant est trop faible. La méthode publiée par @bdemarest ne fonctionne pas sur igraph version> 0.7. La nouvelle version ne prend pas en charge le paramètre area, donc je ne peux pas obtenir le même effet. Et la construction de l'ancienne version m'a pris du temps, donc je pensais partager quelques idées. Vous pouvez installer manuellement igraph 0.7 à partir de la source si vous le téléchargez à partir de igraph nightly builds . Sur ma machine (Mac OS 10.10), j'ai rencontré des problèmes de construction, à cause de gfortran, j'ai donc trouvé ce lien qui a résolu le problème. J'espère que cela aide toute personne qui veut créer des graphiques similaires dans R.

19
morphe

Vous voudrez peut-être essayer layout.fruchterman.reingold(). Il semble faire un bon travail en empêchant les bords de traverser. Je l'ai testé avec une version à 355 nœuds du graphique barabasi suggéré par @ 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

18
bdemarest