R索引要在绘图坐标中使用的矩阵

时间:2019-04-06 13:26:55

标签: r matrix plot igraph

我正在尝试在R中绘制时间社交网络。我的方法是为所有节点创建一个主图和布局。然后,我将基于一系列顶点ID来对图进行子集化。但是,当我这样做并布局图时,我得到了完全不同的节点位置。我认为我不是正确地对布局矩阵进行了子设置。我找不到问题所在,因为我做了一些较小的矩阵子集,而且一切似乎都正常工作。

我在网络图中有一些示例代码和问题图像。

library(igraph)

# make graph
g <- barabasi.game(25)




# make graph and set some aestetics 
set.seed(123)
l <- layout_nicely(g)
V(g)$size <- rescale(degree(g), c(5, 20))
V(g)$shape <- 'none'
V(g)$label.cex <- .75
V(g)$label.color <- 'black'

E(g)$arrow.size = .1

# plot graph

dev.off()

par(mfrow = c(1,2), 
    mar = c(1,1,5,1))


plot(g, layout = l, 
     main = 'Entire\ngraph')


# use index & induced subgraph

v_ids <- sample(1:25, 15, F)
sub_l <- l[v_ids, c(1,2)]
sub_g <- induced_subgraph(g, v_ids)


# plot second graph
plot(sub_g, layout = sub_l,
     main = 'Sub\ngraph') 

enter image description here

第二个绘图中的顶点应该与第一个绘图中的顶点匹配。

2 个答案:

答案 0 :(得分:1)

很遗憾,您在生成图形后 后设置了随机种子, 因此我们无法完全复制您的结果。我将使用相同的代码,但 在生成图形之前使用set.seed。这使结果看起来 与您的不同,但可以重现。

运行代码时,看不到与您完全相同的问题 显示。

您的代码(已移动set.seed并添加了scales

library(igraph)
library(scales)            # for rescale function

# make graph
set.seed(123)
g <- barabasi.game(25)

# make graph and set some aestetics 
l <- layout_nicely(g)
V(g)$size <- rescale(degree(g), c(5, 20))
V(g)$shape <- 'none'
V(g)$label.cex <- .75
V(g)$label.color <- 'black'
E(g)$arrow.size = .1
## V(g)$names = 1:25

# plot graph
dev.off()

par(mfrow = c(1,2), 
    mar = c(1,1,5,1))

plot(g, layout = l, 
     main = 'Entire\ngraph')

# use index & induced subgraph
v_ids <- sort(sample(1:25, 15, F))
sub_l <- l[v_ids, c(1,2)]
sub_g <- induced_subgraph(g, v_ids)

# plot second graph
plot(sub_g, layout = sub_l,
     main = 'Sub\ngraph', vertex.label=V(sub_g)$names) 

Graph with positions preserved, but not labels

当我运行您的代码时,两个图的节点都在同一位置 职位。这不是我在您的问题图中看到的。 我建议您只运行这段代码,看看是否没有得到 结果相同(两个图中的节点位于相同位置)。 我的版本中两个图形之间的唯一区别是 节点标签。取子图时,它会重新编号节点 从1到15,因此节点上的标签不一致。你可以解决 这是通过在将节点标签存储在图中之前 子图。具体来说,请在之后紧接着添加V(g)$names = 1:25 您的声明E(g)$arrow.size = .1。然后运行整件事 再次从set.seed(123)开始。这将保留 原始编号作为节点标签。

Graph with node labels preserved

该图看起来略有不同,因为新的子图 不会占用所有空间,因此可以扩展使用 在空白处。

答案 1 :(得分:-1)

可能的快速解决方法:绘制相同的图形,但是为背景颜色着色不需要的节点和顶点。根据您的目的,它可能适合您。