如何使用匹配的节点坐标在 R 中的 iGraph 中创建图(并删除没有边的节点)
How to create plots in iGraph in R with matching node coordinates (and removing nodes with no edges)
所以,这个问题实际上是一个由两个部分组成的问题,我认为它有一些复杂的背景,但我真的希望 solution/s 不会那么棘手。
本质上,我正在使用 iGraph 在 R 中绘制生物通路,我的目的是从每个通路中获取一个基因子集(节点)并绘制它们,然后获取第二个(和 third/fourth)基因子集并绘制那些。为了便于查看,我将网络绘制为树状图,而且我还特别希望每个路径子集在相同位置具有相同的节点(一些子集仅在 1/2 个节点上不同,一些在几十个节点上不同)。同样,这是为了便于查看(而不是命名),例如,我希望 GENE1 和 GENE2 每次都处于相同的相对位置,但显然在某些图中 GENE1 或 GENE2 不会目前。
这是我当前的代码(以及一些评论)和一些上传的示例图:
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
)
问题:
因此,如您所见,绘图似乎几乎 正在做我想做的事情。然而,出于某种原因,它仍在绘制所有节点,尽管事实上它在每种情况下都使用不同的节点子集(和相同的坐标)。有谁知道我该如何解决这个问题?
我的第二个问题与前者无关,但仍涉及同一段代码。您可能已经注意到这些图非常小,而且我在图中有 rescale = FALSE
。这似乎是我能找到的使整个图真正适合 RStudio window 的唯一方法,但它并不理想,而且它的实际大小似乎有点不可预测。因此,如果有人知道更好的方法,也将不胜感激!
编辑 2:
应其中一位评论者的要求,我试图为我的问题创建一个可重现的示例。这让我想到了另一个问题,这个问题似乎 ,但是,他们使用的解决方案似乎对我不起作用。
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),])
一些注意事项:
- 为了简单起见,我从绘图函数中删除了大部分大小调整方面的内容(稍后我将重新讨论)。
- 理论上我将比较的子路径都来自一个更大的路径,因此我从一个更大的图形对象创建两个图形对象的原因(这实际上将通过不同的方法完成,但我希望这足够相似)。您也可能会说我没有考虑到 g2 有一个 g1 没有的节点的任何情况,但我希望这对我来说不是问题。
- 您可能还注意到,无论出于何种原因,我使用的这种删除方法实际上并没有正确删除预期的顶点(例如,两边都不应该有“5”顶点,但两者都有)。这本身就是一种痛苦,但这并不是我所关心的。更让我困扰的是,理论上,当数字出现时,它们应该在每张图中的相同位置。但他们不是...
我真的希望这能让有人来救我!
P.s。在这种情况下,g1
和 g2
在循环的不同迭代中都是 isubpathway_info
。
我会计算 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),])
所以,这个问题实际上是一个由两个部分组成的问题,我认为它有一些复杂的背景,但我真的希望 solution/s 不会那么棘手。
本质上,我正在使用 iGraph 在 R 中绘制生物通路,我的目的是从每个通路中获取一个基因子集(节点)并绘制它们,然后获取第二个(和 third/fourth)基因子集并绘制那些。为了便于查看,我将网络绘制为树状图,而且我还特别希望每个路径子集在相同位置具有相同的节点(一些子集仅在 1/2 个节点上不同,一些在几十个节点上不同)。同样,这是为了便于查看(而不是命名),例如,我希望 GENE1 和 GENE2 每次都处于相同的相对位置,但显然在某些图中 GENE1 或 GENE2 不会目前。
这是我当前的代码(以及一些评论)和一些上传的示例图:
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
)
问题:
因此,如您所见,绘图似乎几乎 正在做我想做的事情。然而,出于某种原因,它仍在绘制所有节点,尽管事实上它在每种情况下都使用不同的节点子集(和相同的坐标)。有谁知道我该如何解决这个问题?
我的第二个问题与前者无关,但仍涉及同一段代码。您可能已经注意到这些图非常小,而且我在图中有
rescale = FALSE
。这似乎是我能找到的使整个图真正适合 RStudio window 的唯一方法,但它并不理想,而且它的实际大小似乎有点不可预测。因此,如果有人知道更好的方法,也将不胜感激!
编辑 2:
应其中一位评论者的要求,我试图为我的问题创建一个可重现的示例。这让我想到了另一个问题,这个问题似乎
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),])
一些注意事项:
- 为了简单起见,我从绘图函数中删除了大部分大小调整方面的内容(稍后我将重新讨论)。
- 理论上我将比较的子路径都来自一个更大的路径,因此我从一个更大的图形对象创建两个图形对象的原因(这实际上将通过不同的方法完成,但我希望这足够相似)。您也可能会说我没有考虑到 g2 有一个 g1 没有的节点的任何情况,但我希望这对我来说不是问题。
- 您可能还注意到,无论出于何种原因,我使用的这种删除方法实际上并没有正确删除预期的顶点(例如,两边都不应该有“5”顶点,但两者都有)。这本身就是一种痛苦,但这并不是我所关心的。更让我困扰的是,理论上,当数字出现时,它们应该在每张图中的相同位置。但他们不是...
我真的希望这能让有人来救我!
P.s。在这种情况下,g1
和 g2
在循环的不同迭代中都是 isubpathway_info
。
我会计算 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),])