R visNetwork: настроить поведение свертывания для сжатия визуализации графа - PullRequest
1 голос
/ 06 марта 2020

Я хотел бы настроить функциональность свертывания пакета 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 ....

-> Кто-нибудь знает, возможно ли исключить последние узлы каждого пути при свертывании? Или определить количество прыжков (узлов) от узла кластера, который будет свернут?

Заранее спасибо за помощь!

...