Ответ 1
Здесь другой подход, основанный на 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
Мы попросим механизм макета Фрухтермана-Рейнгольда вычислить координаты вершин.
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])
Почти там. У нас уже есть координаты центров вершин в коордах [], но нам также нужен размер вершин в системе координат графика(). Из исходного кода plot.igraph видно, что опция vertex.size для plot() делится на 200, а затем используется как радиус для рисования вершины. Мы используем 50% большее значение в качестве поля вокруг ограничивающей рамки координат вершин при рисовании прямоугольника с пунктиром.
margin <- (vertexsize / 200) * 1.5
rect(llx - margin, lly - margin, urx + margin, ury + margin, lty = 'dotted')
Это результат: