2017-02-05 2 views
2

Essayez de tracer un réseau avec le package ggraph et spécifiez les coordonnées de chaque noeud. Bien que je puisse implémenter ceci avec le paquet igraph - je ne peux pas faire ceci avec le paquet ggraph.Tracé réseau ggraph: spécifiez les coordonnées de noeud

# reproducible example to generate a random graph 
library(igraph) 
g1 <- erdos.renyi.game(20, 1/2) 
plot(g1) 

# function to produce coordinates for each node in order of the node 
# degree (number of links per node) 
coord <- function(g){ 
    n.nod <- length(V(g)) 
    mat.c <- matrix(0, nrow = n.nod, ncol = 2) 
    deg <- degree(g) 
    uniq.deg <- unique(deg) 
    min.d <- min(deg); max.d<- max(deg) 
    spa <- 10/(max.d - min.d) # how much to increment 0 to 10 space along y-axis 

    divi.y.1 <- seq(from = min.d, to=max.d, by = 1) 
    divi.y.2 <- seq(from = 0, to=10, by = spa) # both have same length 

    ind.x <- c(); ind.x[1] = 0 
    for(x in 2:n.nod){ 
     ind.x[x] <- ind.x[x-1] + 0.1 
     if(ind.x[x] >= 10){ 
     ind.x[x] = ind.x[x-1] - 0.1 
     } 
    } 
d1 <- data.frame(divi.y.1, divi.y.2) 

# plotting space of grid is (0,0), (0, 10), (10, 10), (10, 0) 
for(i in 1:n.nod){ 
    # y-axis in order 
    inD <- which(d1$divi.y.1 == deg[i]) 
    mat.c[i, 2] <- d1[inD,2] 
} 
mat.c[, 1] <- ind.x 
return(data.frame(mat.c)) 
} 

Voici la façon "ancienne" de comploter l'objet igraph:

# plot igraph object - the old fashion way 
x11() 
plot(g1, layout = coord(g1), rescale = T, frame=T, 
vertex.frame.color = "black", edge.color = "lightsteelblue", 
edge.width = 1, vertex.label.cex = 1, 
vertex.label.color = "black", 
main = "Nodes in order of degree: top have more links, bottom fewer links") 

Lien vers la documentation ggraph est here. Reportez-vous également au référentiel GitHub pour le ggraph pour les instructions d'installation du package (besoin> version R.3.3). Ci-dessous la parcelle de GGRAPH qui fonctionne (mais je ne l'ai pas spécifié les coordonnées de chaque nœud):

library(ggraph) 
V(g1)$NaMe <- seq(1:20) 

x11() 
    ggraph(g1, 'igraph', algorithm = 'kk') + 
    geom_edge_link(colour = "black", alpha = 0.8, show.legend = F) + 
    geom_node_label(aes(label = NaMe)) + ggtitle("ggraph plot: How to allocate coordinate for each node?") + 
    ggforce::theme_no_axes() 

Voici ma tentative de rendre le terrain ggraph avec coordonnées spécifiées pour chaque nœud. À la suite des exemples similaires et les tentatives antérieures dans ggraph() où les coordonnées des noeuds sont passés sur le terrain, j'ai essayé ce qui suit:

g <- make_ring(10) + make_full_graph(5) 
coords <- layout_(g, as_star()) 
plot(g, layout = coords) 
# try to replicate this example: 
coords2 <- add_layout_(g1, coord(g1)) 

également essayé d'utiliser this function. C'est difficile parce qu'il n'y a pas d'exemple dans la documentation.

Lay <- layout_igraph_manual(g1, coord(g1)) 
Lay <- layout_igraph_igraph(g1, coord(g1)) 

x11() 
ggraph(g1, 'igraph', algorithm = 'kk') + add_layout_(Lay) + 
# layout_igraph_circlepack() + 
geom_edge_link(colour = "black", alpha = 0.8, show.legend = F) + 
geom_node_label(aes(label = NaMe)) + ggtitle("ggraph plot: Cannot allocate coordinate for each node") + 
ggforce::theme_no_axes() 

Répondre

1

En général, vous ne devez pas penser à coordonnées nœud lors de l'utilisation GGRAPH - ils sont fournis automatiquement en fonction de la mise en page choisie. Si vous voulez calculer vous-même la mise en page, utilisez la mise en page manuelle - consultez la documentation pour layout_igraph_manual

1

Merci @ ThomasP85 (wow! Le développeur pour ggraph). Dans ce cas, je voulais spécifier les coordonnées de chacun des nœuds. J'ai essayé layout_igraph_manual, layout_, add_layout_ et beaucoup d'autres et n'ai pas semblé fonctionner.

Qu'est-ce que le travail était ce

co2<- data.frame(coord(g1)) # my mistake above, the output of coord() should be a matrix 
colnames(co2)<- c("x", "y") 
Lay<- createLayout(g1, layout = "nicely") # try any layout 
Lay$x<- co2$x # <== now overwrite their coordinates 
Lay$y<- co2$y 


x11() # <==== this is ggraph version of the igraph plot above 
ggraph(graph=g1, data=Lay) + 
geom_edge_link(colour = "black", alpha = 0.5, show.legend = F) + 
geom_node_label(aes(label = NaMe)) + ggtitle("Nodes with higher degree at top, lower degree nodes at the bottom") + 
ggforce::theme_no_axes() 

@ ThomasP85 si vous pouvez fournir un exemple de travail avec le code ci-dessus en utilisant layout_igraph_manual, il serait très apprécié.

1

Je ne crois pas que ce soit l'intention de l'auteur que vous appeliez directement layout_igraph_manual. Si vous nommez la mise en page comme "manuelle", vous pouvez transmettre les arguments dont vous avez besoin pour mettre en forme les sommets manuellement. Cela m'a fait ce que vous êtes après, si je comprends bien:

coords <- coord(g1) 
names(coords) <- c("x","y") 
coords <- as.data.frame(coords) 

ggraph(g1, layout = "manual", circular = FALSE, node.positions = coords)+ 
    geom_edge_link(colour = "black", alpha = 0.8, show.legend = F) + 
    geom_node_label(aes(label = NaMe)) + ggtitle("ggraph plot: How to allocate coordinate for each node?") + 
    ggforce::theme_no_axes() 

Selon la documentation, il est important que votre mise en page est un manuel dataframe et contient les colonnes x et y. Je l'ai fait à la sortie de votre coord() fonction. Vous voulez probablement juste le mettre à jour pour retourner les données sous cette forme.