You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 19:41:06