这是另一种基于 igraph 的方法。它的灵感来自这个 igraph代码示例。
我假设使用 igraph 而不是 DiagrammeR 是一种选择 - 也许不是这样......
我们将顶点的定位留给标准布局算法,并查询结果顶点位置。然后使用这些位置在任意一组“选定”顶点周围绘制一个虚线矩形。不需要用户交互。
我们从图拓扑开始。
library(igraph)
set.seed(42)
df <- data.frame(from = c('A', 'B', 'I', 'D', 'D', 'E', 'E', 'F', 'F', 'G'),
to = c('B', 'C', 'I', 'E', 'F', 'G', 'F', 'H', 'G', 'H'))
g <- graph.data.frame(df, directed = TRUE)
图中顶点和箭头的大小可以根据喜好自由设置。
vertexsize <- 50
arrowsize <- 0.2
我们要求 Fruchterman-Reingold 布局引擎计算顶点的坐标。
coords <- layout_with_fr(g)
然后绘制图形。
plot(g,
layout = coords,
vertex.size = vertexsize,
edge.arrow.size = arrowsize,
rescale = FALSE,
xlim = range(coords[,1]),
ylim = range(coords[,2]))
如果我们想看看发生了什么,我们可以添加坐标轴并打印顶点坐标:
axis(1)
axis(2)
V(g) # ordered vertex list
coords # coordinates of the vertices (in the same coordinate system as our dotted rectangle)
我们现在找出我们想要一个矩形围绕的顶点的边界框。
selectedVertices = c("A", "B", "C")
vertexIndices <- sapply(selectedVertices, FUN = function(x) { return(as.numeric(V(g)[x])) } )
llx <- min(coords[vertexIndices, 1])
lly <- min(coords[vertexIndices, 2])
urx <- max(coords[vertexIndices, 1])
ury <- max(coords[vertexIndices, 2])
差不多好了。我们已经在 coords[]中获得了顶点中心的坐标,但我们还需要plot() 坐标系中顶点的大小。从 plot.igraph 源代码中,我们可以看到 plot() 的 vertex.size 选项除以 200,然后用作绘制顶点的半径。在绘制虚线矩形时,我们使用大 50% 的值作为顶点坐标边界框周围的边距。
margin <- (vertexsize / 200) * 1.5
rect(llx - margin, lly - margin, urx + margin, ury + margin, lty = 'dotted')
这是我们得到的结果: