Как изменить цвет узла на основе уровня узла в графике CART (rpart.plot) [R] - PullRequest
0 голосов
/ 07 сентября 2018

Я хочу изменить цвет узла на основе уровня узла в CART Plot / rpart.plot на R. Требуемый график такой.

введите описание изображения здесь

Я сделал до этого шага, которого еще не сделал: 1. Переместите значения целевой переменной (Setosa, Versicolor и Virginica) в левую часть графика. 2. Измените цвет узла так, как требуется.

enter image description here

1 Ответ

0 голосов
/ 10 сентября 2018

Под "уровнем узла" я предполагаю, что вы имеете в виду класс, предсказанный на узле. Если это так, сделайте это следующим образом (см. Виньетка с пакетом rpart.plot Рисунок 1 внизу):

library(rpart.plot)
png("aswin.png")
data(iris)
tree <- rpart(Species~., data=iris)
# may have to play with value of legend.x and legend.y for your plot
rpart.plot(tree, type=1, extra=4, legend.x=-.25, legend.y=1.2)
dev.off()

, что дает следующий сюжет

plot

Если вместо «уровень узла» вы подразумеваете глубину узла в дереве, то ваш первый пример фигуры сбивает с толку, потому что на этом рисунке глубина листа узла слева (1.00 .00 .00) 2, но его цвет такой же, как у других конечные узлы на глубине 3. Тем не менее, следующий код закрасит узел по глубине в дереве:

library(rpart.plot)
data(iris)
tree <- rpart(Species~., data=iris)
node.depth <- function(node.number)
{
    node.depth <- 1
    while(node.number > 1) {
        node.number <- node.number %/% 2
        node.depth <- node.depth + 1
    }
    node.depth
}
# node numbers in order they appear in tree$frame
node.numbers <- as.numeric(row.names(tree$frame))
# depth of each node in node.numbers
node.depths <- integer(length(node.numbers))
for(i in 1:length(node.depths))
    node.depths[i] <- node.depth(node.numbers[i])
colors <- topo.colors(n=max(node.depths)) # change these colors to taste
rpart.plot(tree, type=1, extra=4, 
           fallen.leaves=FALSE, nn=TRUE, # optional
           box.col=colors[node.depths])

, который дает следующий сюжет

plot

...