首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ggraph网络图:指定节点坐标

ggraph网络图:指定节点坐标
EN

Stack Overflow用户
提问于 2017-02-05 12:51:33
回答 3查看 2K关注 0票数 2

尝试使用ggraph包绘制网络并指定每个节点的坐标。虽然我可以用igraph包实现这一点,但我不能用ggraph包来实现这一点。

代码语言:javascript
复制
# 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对象的“老式”方法:

代码语言:javascript
复制
# 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文档的链接是here。另请参阅用于ggraph的GitHub存储库,了解软件包安装说明(需要R.3.3以上版本)。下面是工作的ggraph图(但我没有指定每个节点的坐标):

代码语言:javascript
复制
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()中类似的示例和早期的尝试,将节点的坐标传递到绘图中,我尝试了以下方法:

代码语言:javascript
复制
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))

我也尝试过使用this function。这很困难,因为文档中没有示例。

代码语言:javascript
复制
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()
EN

回答 3

Stack Overflow用户

发布于 2017-02-17 21:53:46

我不相信作者的意图是直接调用layout_igraph_manual。如果您将布局命名为"manual“,则可以传递手动布局顶点所需的参数。如果我没理解错的话,这给了我你想要的东西:

代码语言:javascript
复制
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()函数的输出执行了此操作。您可能只想更新它以返回该格式的数据。

票数 3
EN

Stack Overflow用户

发布于 2017-02-07 02:35:36

使用ggraph时,您通常不必考虑节点坐标-它们是基于所选布局自动提供的。如果您想事先自己计算布局,只需使用手动布局-查看layout_igraph_manual文档

票数 1
EN

Stack Overflow用户

发布于 2017-02-11 11:47:17

谢谢@ThomasP85 (哇!ggraph的开发人员)。在本例中,我想指定每个节点的坐标。我尝试过layout_igraph_manuallayout_add_layout_和其他许多工具,但似乎都不起作用。

起作用的是这样的

代码语言:javascript
复制
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的上述代码的工作示例,将不胜感激。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42048671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档