这个问题是question的继续。
我有n
个点,其中(x, y)
个坐标按如下矩阵组织:
A <- t(matrix(c(
0, 0, 1, 0, 1,-1, 1,-2, 0,-2,-1,-2,-2,-2,-2,-1,-1,-1, 0,-1, 0, -2, 0,-3,
0,-4,-1,-4,-1,-3,-1,-2, 0,-2, 1,-2, 2,-2, 2,-3, 1,-3, 0,-3, 0,-2, 0,-1, 0, 0), nrow =2));
如您所见,k=8
对具有重复的(x,y)
坐标。
编辑。
ids <- which(duplicated(A))
k <- length(ids)
我已经创建了igraph对象g
并将其绘制出来。坐标重复的节点在图中用红色表示。其中一些重复两次,有的甚至三到四次。
library(igraph)
g <- make_empty_graph(n=nrow(A))
g <- g + path(seq_len(nrow(A)))
V(g)$id <- seq_len(vcount(g))
V(g)[V(g)$id %in% ids]$color <- "red"
plot(g, layout=as.matrix(A),
edge.arrow.size = 0.3,
edge.curved = TRUE
)
我需要将具有重复坐标的节点合并到一个节点中。
问题。是否可以将具有重复坐标的节点合并到一个节点中?重复的边缘也应合并为一个边缘。边缘的方向可以省略。
答案 0 :(得分:1)
根据我的评论进行进一步的调查,我设法减少了您的图表。这不是小事,因为我必须通过ID向量明确告诉igraph我要合并的节点,即:如果您有四个ID为c(1,2,3,4)的节点,并且您想合并第一个其中三个,则必须提供以下id向量:c(1,1,1,2)。
我也使用了 data.table 库,因为我对它的语法更加熟悉。
我使用的代码:
dt <- as.data.table(A)
groupID <- dt[,.(gID = .GRP),by = list(dt$V1,dt$V2)]
colnames(dt) <- c('X','Y')
colnames(groupID) <- c('X','Y','gid')
dt[groupID, gID := i.gid, on = c(X = 'X', Y = 'Y')]
plot(contract.vertices(g,dt$gID),layout = as.matrix(groupID))
我将给定的 m 矩阵转换为data.table,然后为组标识符创建了另一个dt( data.table ),因此您有一个单独的ID对于每个组,由坐标的唯一组合创建(每个[-2,0]有一个ID,每个[0,0]等都有一个ID)
所以 groupID dt看起来像这样:
X Y gid
1: 0 0 1
2: 1 0 2
3: 1 -1 3
4: 1 -2 4
5: 0 -2 5
6: -1 -2 6
7: -2 -2 7
8: -2 -1 8
9: -1 -1 9
10: 0 -1 10
11: 0 -3 11
12: 0 -4 12
13: -1 -4 13
14: -1 -3 14
15: 2 -2 15
16: 2 -3 16
17: 1 -3 17
此后,我刚刚将列重命名以进行进一步的转换。
下一步是将这两个dts加入到我之前刚刚改名的共享的 X 和 Y 列上。
dt 现在看起来像这样:
X Y gID
1: 0 0 1
2: 1 0 2
3: 1 -1 3
4: 1 -2 4
5: 0 -2 5
6: -1 -2 6
7: -2 -2 7
8: -2 -1 8
9: -1 -1 9
10: 0 -1 10
11: 0 -2 5
12: 0 -3 11
13: 0 -4 12
14: -1 -4 13
...
最后一步是使用 contract.vertices 函数按其ID合并节点。合并的dt的 gID 属性必须作为属性给出,因此它知道必须合并哪些节点。 (您可以将其分配给您的 g ofc变量。)
幸运的是, groupID dt包含适用于您绘图的正确布局,因为它具有组(您的坐标)及其ID。
现在,节点已合并,但是从合并的顶点到其相邻节点仍存在多个边,之后必须将其删除。
转换后,图形如下所示:
对应帖子: