Вот еще один подход, основанный на 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
Мы просим механизм компоновки Фрухтермана-Рейнгольда вычислить координаты вершин.
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])
Почти готово. У нас уже есть координаты вершин centers в координатах [], но нам также нужен размер вершин в системе координат plot(). Из исходного кода plot.igraph видно, что параметр vertex.size для plot() делится на 200 и затем используется как радиус для рисования вершины. Мы используем значение на 50% больше в качестве поля вокруг ограничительной рамки координат вершины при рисовании пунктирного прямоугольника.
margin <- (vertexsize / 200) * 1.5
rect(llx - margin, lly - margin, urx + margin, ury + margin, lty = 'dotted')
Вот такой результат мы получаем:
![введите описание изображения здесь](https://i.stack.imgur.com/q33vM.png)
person
WhiteViking
schedule
01.09.2015
engine = "neato"
(вместо circo) и атрибутpos
:a [pos = '-3,4!', width = 3.5, height = 0.5, shape = rectangle, label = '']
. Взгляните на graphviz.org/content/attrs#dpos stackoverflow.com/questions/5343899 и stackoverflow.com/questions /29208525 - person Steven Beaupré   schedule 03.08.2015subgraph
, но я не уверен, что это то, что вам нужно, поскольку текст в вашей награде предполагает, что вы хотите что-то для разных типов фигур (например, не конкретно для вашего проблема с вопросами?). - person user20650   schedule 04.09.2015