2017-02-05 3 views
2

Versucht, ein Netzwerk mit dem ggraph-Paket zu plotten und die Koordinaten jedes Knotens anzugeben. Während ich dies mit dem igraph Paket implementieren kann - kann ich das mit dem ggraph Paket nicht tun.ggraph network plot: Angeben der Knotenkoordinaten

# 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)) 
} 

ist die "altmodische" Art und Weise die igraph Objekt Plotten:

# 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") 

Link zu ggraph Dokumentation ist here. Bitte beachten Sie auch GitHub-Repository für ggraph für die Paketinstallation Anweisungen (benötigen> R.3.3 Version). Unten ist der ggraph Plot, (aber ich habe nicht die Koordinaten für jeden Knoten angegeben) arbeitet:

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() 

Hier ist mein Versuch, das ggraph Grundstück mit angegebenen Koordinaten für jeden Knoten zu machen. Folgende Beispiele und ähnliche frühere Versuche in ggraph() wo Koordinaten der Knoten auf dem Grundstück übergeben werden, habe ich versucht, die folgenden:

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)) 

auch versucht this function verwenden. Es ist schwierig, weil es kein Beispiel in der Dokumentation gibt.

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() 

Antwort

1

Im Allgemeinen müssen Sie bei der Verwendung von ggraph nicht über Knotenkoordinaten nachdenken - sie werden automatisch basierend auf dem gewählten Layout bereitgestellt. Wenn Sie das Layout selbst vorher berechnen möchten, verwenden Sie einfach das manuelle Layout - lesen Sie die Dokumentation für layout_igraph_manual

1

Danke @ ThomasP85 (wow! Der Entwickler für ggraph). In diesem Fall wollte ich die Koordinaten für jeden der Knoten angeben. Ich habe versucht layout_igraph_manual, layout_, add_layout_ und viele andere und schien nicht zu funktionieren.

Was Arbeit tat dies

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 war, wenn Sie ein funktionierendes Beispiel mit dem obigen Code mit layout_igraph_manual liefern kann, wäre es sehr geschätzt werden.

1

Ich glaube nicht, dass es die Absicht des Autors ist, dass Sie layout_igraph_manual direkt anrufen. Wenn Sie das Layout als "manuell" bezeichnen, können Sie die Argumente übergeben, die Sie benötigen, um die Scheitelpunkte manuell zu erstellen. Dies hat mich, was Sie nach, wenn ich es richtig verstehen:

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() 

Gemäß der Dokumentation ist es wichtig, dass Ihr manuelles Layout ein Datenrahmen und enthält die Spalten x und y. Ich habe dies zur Ausgabe Ihrer coord() Funktion getan. Sie möchten es wahrscheinlich nur aktualisieren, um die Daten in diesem Formular zurückzugeben.