Вращать ветви дерева решений в соответствии со значениями терминальных узлов с помощью ggparty - PullRequest
1 голос
/ 14 апреля 2020

Я строю деревья решений, построенные с partykit в ggparty, и изо всех сил пытаюсь повернуть ветви дерева вокруг узлов ветвей - например, изменить порядок их отображения. Я надеюсь построить дерево с ветвями, отображаемыми в порядке, соответствующем значениям терминальных узлов. Это было бы в некоторой степени сравнимо с использованием reorder() в стандартном ggplot geom.

Например, приведенное ниже использование данных WeatherPlay из виньетки ggparty позволяет ветвям этого дерева вращаться так, чтобы графики конечного узла geom_bar () отображались в порядке возрастания пропорции «да»? В данном случае это будет означать «солнечный», затем «дождливый», затем «пасмурный».

Для моего проекта у меня будут терминальные узлы с коробочными диаграммами, но я предполагаю, что метод для вращающихся ветвей является модульным и может быть перепрофилирован.


## Playing with default WeatherPlay data as demonstrated in ggparty examples here:
# https://cran.r-project.org/web/packages/ggparty/vignettes/ggparty-graphic-partying.html
library(partykit)
library(ggparty)
data("WeatherPlay", package = "partykit")
sp_o <- partysplit(1L, index = 1:3)
sp_h <- partysplit(3L, breaks = 75)
sp_w <- partysplit(4L, index = 1:2)
pn <- partynode(1L, split = sp_o, kids = list(
  partynode(2L, split = sp_h, kids = list(
    partynode(3L, info = "yes"),
    partynode(4L, info = "no"))),
  partynode(5L, info = "yes"),
  partynode(6L, split = sp_w, kids = list(
    partynode(7L, info = "yes"),
    partynode(8L, info = "no")))))
py <- party(pn, WeatherPlay)

# Node plots
n1 <- partynode(id = 1L, split = sp_o, kids = lapply(2L:4L, partynode))
t2 <- party(n1,
            data = WeatherPlay,
            fitted = data.frame(
              "(fitted)" = fitted_node(n1, data = WeatherPlay),
              "(response)" = WeatherPlay$play,
              check.names = FALSE),
            terms = terms(play ~ ., data = WeatherPlay)
)
t2 <- as.constparty(t2)

# Plot tree
ggparty(t2) +
  geom_edge() +
  geom_edge_label() +
  geom_node_splitvar() +
  geom_node_plot(gglist = list(geom_bar(aes(x = "", fill = play),
                                        position = position_fill()),
                               xlab("play")),
                 # draw only one label for each axis
                 shared_axis_labels = TRUE,
                 # draw line between tree and legend
                 legend_separator = TRUE
  )

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...