2017-06-25 5 views
1

Je voudrais créer ce simple terrain igraph:Traçage un réseau igraph avec Diagrammer

library(igraph) 
mydata <- data.table(from=c("John", "John", "Jim"),to=c("John", "Jim", "Jack")) 
mygraph <- graph_from_data_frame(d=mydata, directed=T) 
plot(mygraph, vertex.label.dist=2) 

enter image description here

Avec Diagrammer

library(DiagrammeR) 
mygraph2 <- from_igraph(mygraph) 
grViz(mygraph2) 

Produit cette erreur

erreur dans file.exists (diagramme): invalide « fichier » argument de

J'ai aussi essayé avec

grViz(readLines(mygraph2)) 

et d'autres combinaisons ou la parcelle de commande() mais je ne peux pas trouver la bonne façon.

Comment puis-je le faire?

J'ai openen une nouvelle question pour obtenir le même résultat directement avec Diagrammer, sans igraph:

How to create a network graph with DiagrammeR?

+0

Voulez-vous 'render_graph'? – user20650

Répondre

2

Il semble y avoir deux ou trois choses qui se passent.

library(igraph) 
library(DiagrammeR) 

mydata <- data.table(from=c("John", "John", "Jim"),to=c("John", "Jim", "Jack")) 
mygraph <- graph_from_data_frame(d=mydata, directed=TRUE) 

Le code suivant déclenche une alerte

mygraph2 <- from_igraph(mygraph) 

messages d'avertissement: 1: Dans data.frame (de = as.integer (igraph :: extrémités (igraph, igraph :: E (igraph)) [,: introduit par la contrainte NAs

et si vous regardez mygraph2 il n'y a pas d'info de nœud ou le bord, et il ne marche pas r ender: render_graph(mygraph2). Mais l'avertissement est instructif car il pointe vers les lignes de code (as.integer(ends(mygraph, E(mygraph), names=TRUE)): peut-être que nous voulons names = FAUX), alors essayez de supprimer les noms, mais les étiquettes mis

V(mygraph)$label = V(mygraph)$name 
V(mygraph)$name = factor(V(mygraph)$name, levels=as.character(V(mygraph)$name)) 

Aucun avertissement et rend

mygraph2 <- from_igraph(mygraph) 
render_graph(mygraph2) 

Si vous voulez voir le code dot, vous pouvez utiliser generate_dot, puis passer à grViz, cependant, c'est ce que fait render_graph.

grViz(generate_dot(mygraph2)) 
+0

Est-il préférable de le faire comme ceci ou essayer de créer le graphique directement avec Diagrammer, sans igraph? – skan

+0

J'ai besoin de créer des graphiques à partir de grands ensembles de données. J'ai d'abord essayé d'utiliser igraph car il place automatiquement les nœuds dans un endroit agréable. C'est ce que j'ai lu dans un tutoriel. Mais je ne sais pas quel avantage ou quel inconvénient pourrait avoir l'une ou l'autre méthode. Bien que moins j'utilise de paquets, mieux je n'ai pas besoin de l'étape igraph. – skan

+0

bien si vos graphiques sont grandes, puis générer automatiquement les graphiques plutôt que de taper le code graphviz sera utile (je ne savais pas de 'generate_dot' pour que je puisse utiliser moi-même pour générer initial code graphviz, que je peux ensuite modifier manuellement) – user20650

1

Votre processus comporte deux problèmes.

Le premier est dans la commande from_igraph. Je ne suis pas sûr, c'est peut-être un bug dans le paquet, c'est peut-être un problème avec mon réglage, mais je ne pouvais pas l'utiliser pour obtenir le résultat désiré. Les travaux suivants sur ma machine.

mygraph3 <- from_adj_matrix(as.matrix(get.adjacency(mygraph)), mode = "directed") 

Et puis vous avez besoin render_graph ou quelque chose comme ça pour obtenir votre graphique, grViz est une représentation de chaîne de graphe, pas pour le graphique lui-même.

render_graph(mygraph3) 
+0

Si l'on compare le résultat de votre méthode avec la méthode de user20650, la vôtre ne produit pas des flèches. – skan

+0

set 'mode = "dirigé"' 'dans from_adj_matrix' – user20650

+0

@skan Je corrigeais pour cette erreur dans mon post. Pour avoir un graphe orienté généré à partir de la matrice adjacente, l'argument 'mode' doit être réglé sur" directed ", et ensuite il vous donnera le graphe orienté. Merci d'avoir fait remarquer cela. – Consistency