【问题标题】:Removing or hiding specific edges in iGraph based on nodes基于节点删除或隐藏 iGraph 中的特定边
【发布时间】:2020-06-17 09:50:36
【问题描述】:

这个问题是我上一个问题的后续问题,我已经纠结了一段时间了。

我正在尝试使用 iGraph 包在 R 中可视化网络,但是,我想以完全相同的布局可视化同一网络的不同子集。所以子集之间会有不同的顶点,但我希望每个顶点和边在每个图中都位于同一个位置。

最初,我尝试通过创建整体图的坐标然后绘制具有相同坐标的子图来做到这一点。然而,这最终有几个问题:

  1. iGraph 的顶点位置基于它们的编号,因此,一旦您从图中删除子图的一个顶点,所有后续顶点的编号都会更改,因此它们的位置将是错误的。
  2. 通过给出不再存在的顶点坐标,iGraph(我认为)仍然会尝试绘制它们,这样您就可以得到与子图未连接的节点。

所以,我尝试了不同的策略。现在我绘制整个图表,但尝试简单地为图表中我不想要的部分着色。所以,在下面的例子中:

set.seed(123)

g_overall = erdos.renyi.game(25, 0.3)

removals = c("2" ,"5" ,"13", "19", "25")

coords = layout_as_tree(g_overall,
               root = 1,
               circular = FALSE,
               flip.y = FALSE,
               mode = "all"
               )

V(g_overall)$colour = ifelse(V(g_overall) %in% removals, "blue", "red")

plot.igraph(g_overall,
      layout = coords,
      vertex.shape = "none",
      vertex.label = V(g_overall),
      vertex.label.color = V(g_overall)$colour
      )

这给出了以下内容:

那如果我把代码改成:

plot.igraph(g_overall,
      layout = coords,
      vertex.shape = "none",
      vertex.label = ifelse(V(g_overall)$colour == "red", V(g_overall), NA),
      vertex.label.color = V(g_overall)$colour
      )

这就变成了:

这几乎是现在,但显然现在有需要移除的边缘,我不知道如何处理。理想情况下,我会使用类似的 ifelse 循环,例如:ifelse(starting_node$colour == "red", edge_colour = "black", edge_colour = "white",以便边缘颜色基于其连接的节点(并且像节点一样不可见)。但我想不出办法。

任何建议表示赞赏。

附:当然,我会研究基于完全去除边缘的答案,但我怀疑这会改变布局,因此宁愿坚持“隐藏”它们。

【问题讨论】:

    标签: r networking igraph


    【解决方案1】:

    我认为你可以通过删除不需要的节点而不是隐藏它们来更简单地获得你想要的东西。在此之前,我想对您的代码进行一些小改动,即:

    removals = c(2, 5, 13, 19, 25)
    

    这样,

    g2 = induced_subgraph(g_overall, V(g_overall)[-removals])
    coords2 = coords[-removals,]
    
    plot.igraph(g2,
          layout = coords2,
          vertex.shape = "none",
          vertex.label = V(g_overall)[-removals],
          vertex.label.color = V(g_overall)$colour[-removals]
          )
    

    我在简化图上保留了相同的标签,以模仿您的代码。另一种减少图表的方法,但保留旧标签,请参阅nodes labels after deleting in R

    【讨论】:

    • 我在搁置了几个星期后才回到这个问题,这个答案正是我想要的。我之前确实尝试过使用诱导子图,但我认为我确实以相同的方式创建了坐标,所以这解决了我几周来一直遇到的问题。非常感谢!
    猜你喜欢
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2014-10-19
    • 2012-11-17
    相关资源
    最近更新 更多