【发布时间】:2020-06-17 09:50:36
【问题描述】:
这个问题是我上一个问题的后续问题,我已经纠结了一段时间了。
我正在尝试使用 iGraph 包在 R 中可视化网络,但是,我想以完全相同的布局可视化同一网络的不同子集。所以子集之间会有不同的顶点,但我希望每个顶点和边在每个图中都位于同一个位置。
最初,我尝试通过创建整体图的坐标然后绘制具有相同坐标的子图来做到这一点。然而,这最终有几个问题:
- iGraph 的顶点位置基于它们的编号,因此,一旦您从图中删除子图的一个顶点,所有后续顶点的编号都会更改,因此它们的位置将是错误的。
- 通过给出不再存在的顶点坐标,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