Benutzerdefiniertes Layout in ggnetwork
Aug 29 2020
Ich habe ein Netzwerk mit einem benutzerdefinierten Layout. Ich möchte es mit anpassen ggnetwork(nicht gezeigt, siehe Vignette ). Ich kann die Knotenpositionen an die übergeben ggnetwork (ggplot), aber wie werden die Pfeilpositionen (Kanten) übergeben?
Minimales Beispiel:
myvec<-structure(list(lengths = c(1L, 2L, 27L, 1L, 6L, 1L, 15L, 1L,
23L, 1L, 4L, 2L, 77L, 1L, 1L, 1L, 22L, 2L, 21L, 1L, 3L, 1L, 30L,
2L, 38L, 1L, 40L, 2L, 22L, 1L, 12L, 1L, 8L, 1L, 12L, 1L, 9L,
1L, 9L, 1L, 28L, 2L, 12L, 1L, 31L, 1L, 12L, 1L, 5L, 1L, 15L,
1L, 10L, 1L, 25L, 1L, 16L, 1L, 27L, 1L, 25L, 1L, 31L, 2L, 20L
), values = c(0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0)), class = "rle")
mymat <- structure(unlist(mapply(rep, myvec$values, myvec$lengths) ), .Dim = c(26L, 26L), .Dimnames = list(NULL, NULL) )
library(network)
net1 <- network(mymat,
matrix.type = "adjacency",
ignore.eval = FALSE
,directed=T
)
# finalxy is a modification of:
# library(sna)
# xy = gplot.layout.fruchtermanreingold(net1, NULL)
finalxy<-structure(c(-2, 0, 0, 6, 2, 6, 4, 6, 2, -6, -4, 0, 4, 0, 8, 8,
-4, -2, -2, 8, 10, 2, 0, -4, -2, 4, 4, 2, 4, 4, 0, 2, -2, -2,
2, -2, -2, 0, -4, -2, -4, -2, 0, 0, -2, 0, 0, -2, -4, -4, -4,
4), .Dim = c(26L, 2L) )
net1 %v% "xpos" = finalxy[, 1]
net1 %v% "ypos" = finalxy[, 2]
# ggnet
library(GGally)
gdata <- ggnet2( net1,
label = TRUE,
alpha = 0.9,
label.size = 3
,mode = c("xpos", "ypos")
,layout.exp = 0
,arrow.size = 12, arrow.gap = 0.025)
gdata
# ggnetwork
library(ggnetwork)
ggplot(net1, aes(x = x, y = y, xend = xend, yend = yend) ) +
geom_edges(arrow = arrow(length = unit(1, "pt"), type = "closed")
) +
geom_nodes(aes(x=xpos, y=ypos ), size = 4)
ggnet
ggnetwork
Antworten
2 Ferroao Aug 29 2020 at 04:30
Das funktioniert:
# Get edges from network
library(dplyr)
# From https://stackoverflow.com/questions/42960248/how-to-plot-networks-over-a-map-with-the-least-overlap#answer-43049177
networkdata <- sapply(net1$mel, function(x) c('id_inl' = x$inl, 'id_outl' = x$outl, 'weight' = x$atl$weights)) %>% t %>% as_tibble() posxyOrig<-finalxy[networkdata$id_outl,]
posxyTarg<-finalxy[networkdata$id_inl,]
colnames(posxyOrig)<-c("xorig","yorig")
colnames(posxyTarg)<-c("xtarg","ytarg")
posData<-cbind(networkdata,posxyOrig,posxyTarg )
ggplot(net1 )+
geom_edges(data=posData, aes(x = xorig, y = yorig, xend = xtarg, yend = ytarg),
arrow = arrow(length = unit(10, "pt"), type = "closed")
) +
geom_nodes(aes(x=xpos, y=ypos ), size = 4)