【问题标题】:How to create plots in iGraph in R with matching node coordinates (and removing nodes with no edges)如何在 R 中的 iGraph 中创建具有匹配节点坐标的图(并删除没有边的节点)
【发布时间】:2020-01-06 14:42:36
【问题描述】:

所以,这个问题实际上是一个两部分的问题,我认为有一些复杂的背景,但我真的希望解决方案不会那么棘手。

本质上,我正在使用 iGraph 在 R 中绘制生物通路,我的目的是从每个通路中获取基因(节点)的子集并绘制它们,然后获取第二(和第三/第四)基因子集并将它们绘制为好。为了便于查看,我将网络绘制为树,并且我还特别希望每个路径子集在相同位置具有相同的节点(一些子集仅在 1/2 个节点上有所不同,有些则在几十个节点上不同)。同样,这是为了便于查看(而不是有名称),所以例如我希望 GENE1 和 GENE2 每次都处于相同的位置,但显然在某些图中 GENE1 或 GENE2 不会现在。

这是我当前的代码(以及一些 cmets)和一些上传的示例图:

coords = layout_as_tree(isubpathway_info, ### isubpathway_info is the iGraph object
                          root = match(geneKEGG, V(isubpathway_info)$name), ### Matching the nodes to names
                          circular = FALSE,
                          flip.y = FALSE,
                          mode = "all")

为清楚起见进行编辑: 上面和下面是循环中出现的代码的两个相关部分。每个循环的主要变化是它加载到不同的图形对象中,并且只使用循环的第一个实例来创建坐标。我没有包含其余代码,因为它似乎与问题无关。

### This is done as a loop, so the isubpathway_info is different each time but coords should be the same
### I.e.: different nodes/edges but same coordinates

plot(isubpathway_info,
       layout = coords,
       vertex.size = 50,
       #vertex.label = gene_details$hgnc_symbol[gene_nums], ### I'm not currently using this because labels basically obscure everything
       vertex.label = NA,
       rescale = FALSE,
       ylim = c(1,4),
       xlim = c(-10,10),
       asp = 0
       )

问题:

  1. 所以,如您所见,绘图似乎几乎在做我想要的。但是,由于某种原因,它仍在绘制所有节点,尽管在每种情况下它使用不同的节点子集(和相同的坐标)。有谁知道我应该如何解决这个问题?

  2. 我的第二个问题与前者无关,但仍涉及同一段代码。您可能已经注意到这些情节非常小,而且我在情节中有rescale = FALSE。这似乎是我能找到的使整个绘图真正适合 RStudio 窗口的唯一方法,但这并不理想,而且对于它的实际大小似乎有点不可预测。因此,如果有人知道这样做的更好方法,也将不胜感激!

编辑 2:

应一位评论者的要求,我尝试创建一个可重现的问题示例。这导致我在这里提出另一个问题,似乎是relatively similar to my own,但是,他们使用的解决方案似乎对我不起作用。

set.seed(123)

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

removals1 = c("2" ,"5" ,"13", "19", "25")
removals2 = c("2" ,"5" ,"11", "13", "19", "22", "24", "25")

g1 = induced_subgraph(g_overall, V(g_overall)[-as.numeric(removals1)])
g2 = induced_subgraph(g_overall, V(g_overall)[-as.numeric(removals2)])

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

plot.igraph(g1,
        layout = coords)

plot.igraph(g2,
        layout = coords[-as.numeric(removals),])

一些注意事项:

  1. 为了简单起见,我从绘图功能中删除了大部分尺寸方面的内容(稍后我会重新讨论)。
  2. 理论上,我将比较的子路径都来自一个更大的路径,因此我从一个更大的图形对象创建了两个图形对象(这实际上将通过不同的方法完成,但我希望这个足够相似)。您也可能会评论说,我没有考虑到 g2 具有 g1 没有的节点的任何情况,但我希望这对我来说不会成为问题。
  3. 您可能还注意到,无论出于何种原因,我使用的这种删除方法实际上并没有正确删除预期的顶点(例如,任何一方都不应该有“5”顶点并且两者都有)。仅此一项就很痛苦,但这并不是我所关心的。更让我困扰的是,理论上,当数字出现时,它们应该在每个图表中处于相同的位置。但他们不是……

我真的希望这能让有人来这里救我!

附:在这种情况下,g1g2 在循环的不同迭代中都将是 isubpathway_info

【问题讨论】:

  • 也许只是将您不想显示的节点和链接涂成白色?目前尚不清楚您在循环中更新 isubpathway_info 的操作,但听起来您删除了链接而不是节点。
  • 所以,这实际上是彼此相当独立的两段代码,我在这里只将它们并排放置,因为它们是与问题相关的部分(而不是由代码的其他位更改)我将编辑问题以澄清这一点。我也不确定为节点着色是否正确(实际上不知道如何为技术上不存在的节点着色)。
  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则会更容易为您提供帮助。
  • 为什么不从 g_overall 计算每个节点的坐标,并从坐标中删除不再在图中的节点?然后,当您绘制 g_overall、g1 和 g2 时,相同的节点将具有相同的位置。这就是你想做的,对吧?编辑:在您的可重现示例中,将 g1 替换为 g_overall 应该可以工作
  • 另外,我会简单地使用 delete_vertices(g_overall,removingsX) (或 subgraph(g_overall, to_keep))来代替induced_subgraph

标签: r plot rstudio igraph


【解决方案1】:

我将计算 g_overall 上的坐标,然后使用先前计算的坐标在子图上绘制图(一旦删除不再在图中的节点的坐标)。换句话说:

set.seed(123)

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

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

removals1 = c("2" ,"5" ,"13", "19", "25")
removals2 = c("2" ,"5" ,"11", "13", "19", "22", "24", "25")

g1 = delete_vertices(g_overall, removals1)
g2 = delete_vertices(g_overall, removals2)

plot.igraph(g1,
        layout = coords[-as.numeric(removals),])

plot.igraph(g2,
        layout = coords[-as.numeric(removals),])

【讨论】:

    猜你喜欢
    • 2020-07-19
    • 2017-07-29
    • 2014-08-06
    • 2013-02-04
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多