【问题标题】:R Indexing a matrix to use in plot coordinatesR索引矩阵以在绘图坐标中使用
【发布时间】:2019-08-28 04:35:34
【问题描述】:

我正在尝试在 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') 

第二个图中的顶点应该与第一个图中的顶点布局相匹配。

【问题讨论】:

    标签: r matrix plot igraph


    【解决方案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) 
    

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

    图表看起来略有不同,因为新的子图表 不占用所有空间,因此可以使用 把空的地方。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2020-11-05
        • 2015-12-09
        • 2012-05-28
        • 2021-12-04
        • 2018-03-20
        • 2022-01-25
        • 2013-06-20
        • 2018-05-18
        • 1970-01-01
        相关资源
        最近更新 更多