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

如何在R及Jupyter中美化决策树?R新手技术求助

嘿,作为R和决策树的新手,你遇到的这个可视化拥挤问题我太懂了——party包的ctree默认绘图确实容易挤成一团,尤其是在Jupyter环境里。另外rpart那边的分类变量问题也很好解决,下面给你几个实用的方案,帮你搞定这两个麻烦:

优化party包ctree的可视化效果

如果你想继续用party包,这两个方法能大幅改善绘图效果:

  • 调整ctree默认绘图参数
    ctree的plot()函数有很多可自定义的参数,通过减小字体、简化节点内容、调整间距就能让树变清爽。试试这段代码:

    plot(surv_tree, 
         main = "泰坦尼克号生存决策树",
         node_font = list(size = 10),  # 缩小节点文字尺寸
         edge_font = list(size = 8),   # 缩小分支标签文字
         inner_panel = node_inner(surv_tree, pval = FALSE),  # 移除节点内的p值,减少冗余
         terminal_panel = node_terminal(surv_tree, digits = 2, fill = "lightblue")  # 设置终端节点的填充色和小数位数
         )
    

    去掉不必要的信息后,树的布局会宽松很多,Jupyter里显示也会更清晰。

  • 用ggparty包(强烈推荐)
    这是基于ggplot2的party可视化工具,能完全自定义树的样式,输出的图在Jupyter里适配性更好。先安装并加载包:

    install.packages("ggparty")
    library(ggparty)
    

    然后用这段代码绘图:

    ggparty(surv_tree) +
      # 绘制节点标签,显示节点ID和分割变量
      geom_node_label(aes(label = paste0("节点 ", id, "\n", splitvar)),
                      fontface = "bold", size = 3.5) +
      # 每个节点内添加生存比例的条形图
      geom_node_plot(gglist = list(ggplot(aes(x = "", fill = Survived)) +
                                     geom_bar(position = "fill") +
                                     scale_y_continuous(labels = scales::percent) +
                                     theme_minimal()),
                     shared_axis_labels = TRUE) +
      # 绘制分支的条件标签
      geom_edge_label(aes(label = splitval_level), size = 3) +
      # 设置标题样式
      theme(plot.title = element_text(hjust = 0.5, size = 14)) +
      ggtitle("泰坦尼克号生存决策树")
    

    这种方式把每个节点的生存分布用条形图展示,结构清晰,还能随意调整颜色、字体、布局,非常适合Jupyter的输出场景。

修复rpart包的分类变量问题

你说rpart没把Pclass当作分类变量,其实是因为需要明确告诉它哪些是分类变量。只要提前把Pclass转成因子,或者在公式里用as.factor()包裹,就能解决准确性问题,再搭配rpart.plot包美化,效果会很棒:

library(rpart)
library(rpart.plot)

# 先把Pclass转换为分类变量(或者在公式里写as.factor(Pclass)也行)
titanic_train$Pclass <- as.factor(titanic_train$Pclass)

# 构建rpart决策树
surv_rpart <- rpart(as.factor(Survived) ~ Pclass + Sex + Age, data = titanic_train)

# 用rpart.plot绘制美化后的树
rpart.plot(surv_rpart, 
           type = 4,  # 显示节点的分类结果
           extra = 100,  # 显示每个节点的样本占比
           under = TRUE,  # 把百分比放在节点下方,避免拥挤
           cex = 0.8,  # 缩小文字大小
           box.col = c("lightgreen", "pink")[surv_rpart$frame$yval]  # 按生存状态给节点上色
           )

这样rpart就会正确处理Pclass的分类属性,而且rpart.plot输出的图简洁明了,在Jupyter里显示效果极佳。

内容的提问来源于stack exchange,提问作者Emily Lerman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:56:16