问题描述
尝试使用ggraph
程序包绘制网络并指定每个节点的坐标.虽然可以使用igraph
包实现此功能-但不能使用ggraph
包实现此功能.
Trying to plot a network with the ggraph
package and specify the coordinates of each node. While I can implement this with the igraph
package - I cannot do this with the ggraph
package.
# 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
对象的老式"方法:
Here is the "old fashioned" way of plotting the igraph
object:
# 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
文档的链接位于此处.另请参阅ggraph
的GitHub存储库以获取软件包安装说明(需要> R.3.3版本).以下是有效的ggraph图(但我尚未指定每个节点的坐标):
Link to ggraph
documentation is here. Please also see GitHub repository for ggraph
for package installation instructions (need >R.3.3 version). Below is the ggraph plot that works (but I haven't specified the coordinates for each node):
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()
中类似的示例和更早的尝试中,将节点的坐标传递到绘图上,我尝试了以下操作:
Here is my attempt to make the ggraph
plot with specified coordinates for each node. Following similar examples and earlier attempts in ggraph()
where coordinates of the nodes are passed onto the plot, I tried the following:
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))
还尝试使用此功能.这很困难,因为文档中没有示例.
Also tried using this function. It is difficult because there is not an example in the 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()
推荐答案
我不认为您直接调用layout_igraph_manual
是作者的意图.如果将布局命名为手动",则可以传入需要手动布局顶点的参数.如果我正确理解的话,这就会带给我你的追求:
I don't believe it is the author's intention that you call layout_igraph_manual
directly. If you name the layout as "manual" you can pass in the arguments you need to layout the vertices manually. This got me what you are after, if I understand it correctly:
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()
函数的输出执行了此操作.您可能只想更新它,以该形式返回数据.
According to the documentation it is important that your manual layout is a dataframe and contains the columns x
and y
. I have done this to the output of your coord()
function. You probably just want to update it to return the data in that form.
这篇关于ggraph网络图:指定节点坐标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!