График сети ggraph: укажите координаты узла
Попытка построить сеть с ggraph
упаковать и указать координаты каждого узла. Хотя я могу реализовать это с igraph
пакет - я не могу сделать это с ggraph
пакет.
# 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))
}
Вот "старомодный" способ построения 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")
Ссылка на ggraph
документация здесь. Пожалуйста, смотрите также GitHub репозиторий для ggraph
для инструкций по установке пакета (требуется> версия R.3.3). Ниже приведен график работы ggraph (но я не указал координаты для каждого узла):
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()
Вот моя попытка сделать ggraph
график с указанными координатами для каждого узла. Следуя аналогичным примерам и более ранним попыткам ggraph()
где координаты узлов передаются на график, я пробовал следующее:
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))
Также пытался использовать эту функцию. Это сложно, потому что в документации нет примера.
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()
3 ответа
Я не верю, что автор намерен назвать layout_igraph_manual
непосредственно. Если вы называете компоновку как "ручную", вы можете передать аргументы, необходимые для компоновки вершин вручную. Это дало мне то, что вы ищете, если я правильно понимаю:
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()
В соответствии с документацией важно, чтобы ваша ручная компоновка представляла собой фрейм данных и содержала столбцы x
а также y
, Я сделал это для вывода вашего coord()
функция. Вы, вероятно, просто хотите обновить его, чтобы вернуть данные в этой форме.
Спасибо @ThomasP85 (вау! Разработчик для ggraph). В этом случае я хотел указать координаты для каждого из узлов. я пробовал layout_igraph_manual
, layout_
, add_layout_
и многие другие так и не сработали.
Что сработало, так это
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, если вы можете предоставить рабочий пример с кодом выше, используя layout_igraph_manual
, Это будет высоко ценится.
Как правило, вам не нужно думать о координатах узла при использовании ggraph - они предоставляются автоматически в зависимости от выбранного макета. Если вы хотите заранее рассчитать макет, просто используйте макет вручную - проверьте документацию для layout_igraph_manual