在绘图框中使用相同的坐标和相同的位置绘制两个IGRAPHE网络

在绘图框中使用相同的坐标和相同的位置绘制两个IGRAPHE网络,r,plot,igraph,R,Plot,Igraph,我试图绘制一个随时间变化的网络。网络从一定数量的节点和边开始,每一步都会删除一些节点和边 我希望能够绘制网络,使每个节点位于相同的位置。然而,当我尝试这个。有时,即使节点之间的关系相同,节点也会在绘图帧中移动位置 我正在将网络更改为gif格式,所以即使是很小的更改也很烦人。我认为当大部分节点被移除时,可能会发生变化,但我不确定 下面的代码使用ER图说明了这一点 library(igraph); library(dplyr) #generate random graph set.seed(500

我试图绘制一个随时间变化的网络。网络从一定数量的节点和边开始,每一步都会删除一些节点和边

我希望能够绘制网络,使每个节点位于相同的位置。然而,当我尝试这个。有时,即使节点之间的关系相同,节点也会在绘图帧中移动位置

我正在将网络更改为gif格式,所以即使是很小的更改也很烦人。我认为当大部分节点被移除时,可能会发生变化,但我不确定

下面的代码使用ER图说明了这一点

library(igraph); library(dplyr)

#generate random graph
set.seed(500)
RandomGraph <- sample_gnm(1000, 2500)

#name nodes
V(RandomGraph)$name <- paste0("Node", 1:1000)

#Get the coordinates of the Nodes
Coords <- layout_with_fr(RandomGraph) %>% 
  as_tibble %>%
    bind_cols(data_frame(names = names(V(RandomGraph))))

#Delete random vertices
deletevertex <-sample( V(RandomGraph)$name, 400)

RandomGraph2 <-delete.vertices(RandomGraph, deletevertex)

#get the coordinates of the remaining Nodes
  NetCoords <- data_frame(names = names(V(RandomGraph2))) %>%
    left_join(Coords, by= "names")

#plot both graphs

RandomGraph%>% 
  plot(.,vertex.size=.8, edge.arrow.size=.4, vertex.label = NA, layout = as.matrix(Coords[,1:2]))

RandomGraph2%>% 
  plot(.,vertex.size=.8, edge.arrow.size=.4, vertex.label = NA, layout = as.matrix(NetCoords[,2:3]))

#They nodes have the same relationship to each other but are not laid out in the same position in the frame
库(igraph);图书馆(dplyr)
#生成随机图
种子集(500)

RandomGraphplot.igraph默认情况下会重新缩放每个轴(在x和y轴上从-1到+1)

您只需将其关闭:
rescale=F
,然后显式设置适当的
xlim
ylim

对于您的示例代码

RandomGraph%>% 
  plot(.,vertex.size=.8, edge.arrow.size=.4, vertex.label = NA, layout = as.matrix(Coords[,1:2]),rescale=F,xlim=c(-25,30),ylim=c(-20,35))

RandomGraph2%>% 
  plot(.,vertex.size=.8, edge.arrow.size=.4, vertex.label = NA, layout = as.matrix(NetCoords[,2:3]),rescale=F,xlim=c(-25,30),ylim=c(-20,35))
问题是

identical(range(Coords[1]), range(NetCoords[2]))
# [1] FALSE
由于IGRAPHE在打印前将坐标标准化为-1到1之间的范围,这导致
NetCoords
的坐标与
Coords
略有不同。我只需预先计算所有节点的标准化坐标:

coords_rescaled <- sapply(Coords[-3], function(x) -1+((x-min(x))*2)/diff(range(x)))
rownames(coords_rescaled) <- Coords$names

可能的副本。还要感谢我使用下面的控件控制了xlim/ylim,这使我能够跨图形迭代使用该解决方案。xlim=c(最小(坐标[,1]),最大(坐标[,1]))
par(mfrow=c(1,2), mar=c(1,.5,1,.5))
RandomGraph%>% 
  plot(.,edge.arrow.size=.4, layout = coords_rescaled, rescale=F);box()
RandomGraph2%>% 
  plot(.,edge.arrow.size=.4, layout = coords_rescaled[NetCoords$names, ], rescale=F);box()