如何使用partykit将回归树终端节点箱线图的Y轴设为对数刻度
给partykit回归树终端节点箱线图设置对数Y轴
我来帮你搞定这个需求!要让partykit绘制的回归树终端节点箱线图使用对数Y轴,我们需要自定义一个终端面板函数——因为默认的node_boxplot没有直接提供对数刻度的参数,不过我们可以基于它修改绘图逻辑,具体步骤如下:
步骤1:自定义对数刻度的终端面板函数
我们可以写一个继承自node_boxplot的自定义函数,在绘制箱线图时添加对数刻度的设置:
# 定义带对数Y轴的终端箱线图面板函数 log_node_boxplot <- function(obj, col = "black", fill = "lightgray", width = 0.5, yscale = NULL, ylines = 3, cex = 0.5, id = TRUE) { # 先调用默认的node_boxplot获取基础面板结构 base_panel <- node_boxplot(obj, col = col, fill = fill, width = width, yscale = yscale, ylines = ylines, cex = cex, id = id) # 重写面板的draw函数,加入对数刻度设置 base_panel$draw <- function(node) { # 获取当前节点的响应变量数据(这里是Price) y_vals <- obj$data[[obj$response]][node$id] # 处理Y轴范围:确保数据大于0(对数不能处理非正数),并转换为对数范围 if (is.null(yscale)) { valid_y <- y_vals[y_vals > 0] y_log_range <- log10(range(valid_y)) yscale <- 10^y_log_range # 转换回原始刻度用于箱线图的ylim } # 绘制箱线图,指定log="y"开启对数Y轴 boxplot(y_vals, at = 0, col = fill, border = col, width = width, log = "y", ylim = yscale, axes = FALSE) # 添加Y轴(保持刻度可读性) axis(2, las = 1, cex.axis = cex) # 显示节点ID(如果开启id参数) if (id) { text(0, par("usr")[3] - 0.1 * diff(par("usr")[3:4]), labels = node$id, cex = cex) } # 添加响应变量标签 mtext(obj$response, side = 2, line = ylines, cex = cex) } return(base_panel) }
步骤2:使用自定义面板绘制树
接下来用你原来的代码加载数据、构建树,然后调用自定义面板绘图:
library("rpart") library("partykit") # 构建回归树 fit <- rpart(Price ~ Mileage + Type + Country, cu.summary) tree.2 <- as.party(fit) # 使用自定义对数面板绘图 plot(tree.2, type = "simple", terminal_panel = log_node_boxplot(tree.2, col = "black", fill = "lightgray", width = 0.5, ylines = 3, cex = 0.5, id = TRUE))
注意事项
- 如果你的
Price变量存在0或负数,对数转换会报错,这时候可以先对数据做预处理(比如给所有价格加一个小正数,或者过滤掉非正数值)。 - 自定义函数里的
log="y"是给boxplot函数的参数,它会自动将Y轴转换为对数刻度,同时保留原始数据的箱线图形态。
内容的提问来源于stack exchange,提问作者Alvaro GC
相关产品推荐
相关产品推荐

