ggraph网络图:指定节点坐标 [英] ggraph network plot: specify node coordinates

查看:558
本文介绍了ggraph网络图:指定节点坐标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

尝试使用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()

根据文档,重要的是,您的手动布局是一个数据框,并包含列xy.我已经对您的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网络图:指定节点坐标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆