R语言prp包节点按准确率着色:nod.fun与pal.node.fun使用问题
解决rpart.plot节点自定义准确率着色问题(附替代方案)
一、修复rpart.plot的pal.node.fun用法
你的问题核心是pal.node.fun=TRUE要求node.fun必须先返回数值型的着色依据,再返回节点标签文本。之前的node.fun只返回了带文本的字符串,且未针对单个节点提取对应准确率,导致程序无法识别用于着色的数值。
修改后的代码如下:
# Decision tree 2 tree2 = rpart(Year1GPAcategory~HSGPA+BestACTScore+Age+EssayExecutionScore, data=traindata_3.0, method = "class", cp=0.008, parms=list(split="gini"), minbucket=300) # 计算节点准确率并加入frame tree2$frame$accuracy <- as.numeric(round(((tree2$frame$n - tree2$frame$dev)/tree2$frame$n)*100, 0)) # 重写node.fun:先返回数值(用于着色),再返回标签文本 nodelabel <- function(x, labs, digits, varlen){ # x是当前节点的索引,对应tree2$frame的行号 acc <- tree2$frame$accuracy[x] # 返回列表:第一个元素是数值(供pal.node.fun使用),第二个是要显示的标签 list(acc, paste0(labs, "\n\nAccuracy: ", acc, "%")) } # 绘制树图 rpart.plot(tree2, type=5, extra=2, under=TRUE, cex=0.6, main="Decision Tree 2 Results Using 3.0 Year 1 GPA Split", cex.main=1.5, sub="Tree diagram resulting from a model using 4 variables: HS GPA, Best ACT, Age & Essay Execution", cex.sub=0.9, box.palette=c("#4c6888","#b9d9eb","#d6d2c4", "#D9C89E"), pal.node.fun=TRUE, # 启用node.fun返回的数值作为着色依据 node.fun=nodelabel)
关键改动说明:
node.fun接收的x参数是当前节点的索引,必须用它提取对应行的accuracy,而非直接取整个向量- 返回值改为列表:第一个元素是准确率数值(供调色板映射),第二个是拼接好的节点标签文本
pal.node.fun=TRUE会自动识别列表的第一个数值,将其与box.palette关联着色
二、替代方案:使用ggparty(ggplot2风格决策树)
如果rpart.plot的参数逻辑仍难以调试,可以使用ggparty包——它基于ggplot2,更灵活支持自定义节点着色和标签:
安装并加载包
install.packages("ggparty") library(ggparty) library(partykit)
转换rpart对象为partykit格式并绘图
# 转换rpart模型为partykit对象 tree_party <- as.party(tree2) # 绘制树图,自定义节点着色和标签 ggparty(tree_party) + geom_edge() + geom_node_splitvar() + geom_node_plot( gglist = list( geom_text(aes(label = paste0(prediction, "\n\nAccuracy: ", accuracy, "%")), size = 3) ), # 传递自定义accuracy到绘图数据 data = function(node){ data.frame( prediction = names(which.max(node$node$prediction)), accuracy = tree2$frame$accuracy[node$id] ) } ) + # 根据accuracy设置节点填充色 geom_node_fill(aes(fill = tree2$frame$accuracy[node$id])) + scale_fill_gradientn(colors = c("#4c6888","#b9d9eb","#d6d2c4", "#D9C89E")) + labs(title = "Decision Tree 2 Results Using 3.0 Year 1 GPA Split", subtitle = "Tree diagram resulting from a model using 4 variables: HS GPA, Best ACT, Age & Essay Execution") + theme(plot.title = element_text(size = 18), plot.subtitle = element_text(size = 12))
该方案逻辑更直观,直接通过aes(fill = ...)绑定自定义的准确率变量,无需依赖特殊参数规则。
内容的提问来源于stack exchange,提问作者Carz
相关产品推荐
相关产品推荐

