Я хотел бы настроить функциональность свертывания пакета R visNetwork
.
Iam, используя R version 3.6.2
, RStudio Version 1.2.5033
и visNetwork version 2.0.9
.
Стандартное поведение состоит в том, что после двойного щелчка по узлу каждый исходящий путь и соответствующие узлы и отношения из этого узла свернуты в выбранный узел. Но я хотел бы настроить функциональность свертывания так, чтобы n конечных узлов не были свернуты.
Вот пример графика:
library(dplyr)
library(visNetwork)
nod <- tibble(id = c (1,2,3,4,5,6), label = c("a","b","c","d","e","f"), x= c(0,1,2,3,3,2)*150,y = c(0,0,0,0,-1,1)*150)
# standard behavior
edg <- tibble(id = 1:5, from = c(1,2,3,3,3), to = c(2,3,4,5,6))
edg <- edg %>% mutate(arrows = c("to","to","to","to","to"))
# first solution: under the hood arrows starting from d, e and f and arrow head is at the from-node
edg <- tibble(id = 1:5, from = c(1,2,4,5,6), to = c(2,3,3,3,3))
edg <- edg %>% mutate(arrows = c("to","to","from","from","from"))
##
graph <- visNetwork(nod, edg) %>%
visEdges(smooth = F) %>%
visNodes(fixed = TRUE) %>%
visOptions(collapse = list(enabled = T, keepCoord = T)) %>%
visPhysics(enabled = F) %>%
visLayout(randomSeed = 123)
При двойном щелчке на node b
, я хотел бы, чтобы только node c
объединено в node b
, а конечные узлы node d
, node e
и node f
все еще не свернуты. Идея состоит в том, чтобы сжать огромный граф двойным щелчком мыши, чтобы динамически проиллюстрировать только взаимосвязь между начальными узлами и конечными узлами без учета пути между ними.
На следующем изображении исходного графа: Initial график
и график, который выглядит как нужно: Кластерный сжатый график
Мое первое решение - изменить направление под капотом стрелки конечных узлов, так что стрелки указывают от node d
, node e
и node f
до node c
, следовательно, путь от node a
до node b
не продолжается после node c
. Кроме того, я изменил положение соответствующих наконечников стрелок так, чтобы они находились в начальных узлах (d, e, f). Следовательно, график выглядит так, как нужно с желаемым поведением свертывания.
Мне интересно, есть ли более умный способ, например, функция:
function (graph, cluster = "node b", other_nodes = c ("узел c", "узел f")), то есть после выполнения только кластеризация в этом примере node c
и node f
в node b
из графа graph
. Дополнительные аргументы функции могут быть include_last_node
= ИСТИНА или ЛОЖЬ, определить прыжки из узла кластера для свертывания с помощью n_hops = number ....
-> Кто-нибудь знает, возможно ли исключить последние узлы каждого пути при свертывании? Или определить количество прыжков (узлов) от узла кластера, который будет свернут?
Заранее спасибо за помощь!