Данные графика. Раскраска и маркировка деревьев по уровням - PullRequest
0 голосов
/ 16 июня 2020

У меня следующая структура data.tree.

d <- structure(list(SUBZONE = c("A1", "A2", "A3", "A4", "A8", "B10",  "B11", "B2", "B3", "B4"), 
                    ZONE = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"), 
                    ID = c(1L, 2L, 3L, 4L, 5L, 7L, 8L, 9L, 10L, 11L)), 
               .Names = c("SUBZONE", "ZONE", "ID"), 
               row.names = c(NA, 10L), 
               class = "data.frame")

d$pathString <- paste("all", d$ZONE,d$SUBZONE, sep = "/")
alltree <-as.Node(d)
plot(alltree)

Это дерево имеет три разных уровня в соответствии с графиком и alltree$Get(function(x) c(level = x$level)):

enter image description here

Я хочу добиться двух вещей при форматировании этого графика:

  1. Раскрашивание по уровню ящиков,
  2. Метка за меткой.

enter image description here

Я не знаю, как получить доступ к уровням, хотя пытался. В этом случае я «назвал» узлы, но это не относится ко всем деревьям, которые у меня есть, поэтому я хочу получить к ним доступ по номеру уровня.

1 Ответ

1 голос
/ 16 июня 2020

Вы можете получить коллекцию всех узлов на уровне, используя Traverse:

level1 <- Traverse(alltree, filterFun = function(x) x$level == 1)
level2 <- Traverse(alltree, filterFun = function(x) x$level == 2)
level3 <- Traverse(alltree, filterFun = function(x) x$level == 3)

Это позволяет вам раскрасить узлы по мере необходимости следующим образом:

Do(level1, SetNodeStyle, style = "filled", fillcolor = "#fff200", 
   fontcolor = "black", inherit = FALSE)
Do(level2, SetNodeStyle, style = "filled", fillcolor = "#feadc9", 
   fontcolor = "black", inherit = FALSE)
Do(level3, SetNodeStyle, style = "filled", fillcolor = "#b5e51a", 
   fontcolor = "black", inherit = FALSE)

Что дает такой результат:

plot(alltree)

enter image description here

Что касается построения уровней, я не могу найти какой-либо собственный способ сделать это в самом пакете , хотя предположительно, если вы экспортируете в формат DiagrammeR, это будет возможно.

...