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

partykit终端节点优化:不等长回归器名的文本对齐与框体调整

我来帮你搞定这个partykit决策树终端节点的样式问题!你想要让节点框能放下完整的回归器名称,还得让文本像表格一样对齐,之前的问题主要是参数放错了位置,另外没对文本做格式化对齐处理。下面是具体的解决方案:

1. 修正参数位置,增大节点框体

你之前把boxwidth和margin放到gpar()里是错误的——这两个参数属于node_terminal面板的配置项,需要放到tp_args中;而gpar只用来设置字体大小、颜色这类图形属性。

2. 格式化文本实现表格对齐

要让不同长度的回归器名称和数值整齐对齐,我们可以用stringr::str_pad函数给每个字段设置固定宽度,让输出的文本自动呈现表格样式。


完整代码示例

library("partykit")
library("stringr") # 用于文本对齐处理
set.seed(1234L)
data("PimaIndiansDiabetes", package = "mlbench")

## 逻辑回归拟合函数
logit <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) {
  glm(y ~ 0 + x, family = binomial, start = start, ...)
}

## 添加长/短名称的回归器
PimaIndiansDiabetes$looooong_name_1 <- rnorm(nrow(PimaIndiansDiabetes))
PimaIndiansDiabetes$looooong_name_2 <- rnorm(nrow(PimaIndiansDiabetes))
PimaIndiansDiabetes$short_name <- rnorm(nrow(PimaIndiansDiabetes))

## 构建逻辑回归树
pid_tree <- mob(diabetes ~ glucose + looooong_name_1 + looooong_name_2 + short_name | pregnant + pressure + triceps + insulin + mass + pedigree + age, 
                data = PimaIndiansDiabetes, fit = logit)

## 优化后的汇总函数:实现文本对齐
mysummary <- function(info, digits = 2) {
  n <- info$nobs
  # 提取回归器名称和统计量
  na <- names(coef(info$object))
  cf <- round(coef(info$object), digits = digits)
  t_val <- round(coef(info$object)/sqrt(diag(vcov(info$object))), digits = digits)
  
  # 自动计算每列的最大宽度,适配最长内容
  col1_width <- max(str_length(na), str_length("Regressor"))
  col2_width <- max(str_length(as.character(cf)), str_length("beta"))
  col3_width <- max(str_length(as.character(t_val)), str_length("t-ratio"))
  
  # 格式化表头和每行内容,实现右对齐
  header <- str_c(str_pad("Regressor", col1_width, side = "right"),
                  "  ", str_pad("beta", col2_width, side = "right"),
                  "  [ ", str_pad("t-ratio", col3_width, side = "right"), " ]")
  rows <- mapply(function(name, beta, t) {
    str_c(str_pad(name, col1_width, side = "right"),
          "  ", str_pad(beta, col2_width, side = "right"),
          "  [ ", str_pad(t, col3_width, side = "right"), " ]")
  }, na, cf, t_val)
  
  # 组合所有内容(样本量+表头+数据行)
  c(paste("n =", n), header, rows)
}

## 绘制树:参数位置正确设置
plot(pid_tree, 
     terminal_panel = node_terminal, 
     tp_args = list(FUN = mysummary, 
                    fill = "white",
                    boxwidth = 25, # 可根据回归器名称长度调整,越大框体越宽
                    margin = rep(0.5, 4)), # 节点内部边距,避免文本贴框
     gp = gpar(fontsize = 10)) # 字体大小在这里设置

关键说明

  • boxwidth:控制终端节点的宽度,你可以根据回归器名称的实际长度调整数值(比如名称更长就设为30)。
  • margin:设置节点内部的边距,让文本和框体之间有留白,更美观。
  • 文本对齐:用str_pad的side = "right"实现右对齐,你也可以改成"left"换成左对齐,根据偏好调整。
  • 自动列宽:通过max(str_length(...))自动计算每列的最大宽度,不管回归器名称长短都能适配。

内容的提问来源于stack exchange,提问作者Álvaro A. Gutiérrez-Vargas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:27:56