如何修改ggpubr的ggboxplot隐藏须线并保留自定义功能?含优化与轴范围疑问
问题与解决方案:ggpubr箱线图隐藏须线+统计标注+轴范围调整
问题背景
之前在Stack Overflow提问过如何隐藏ggpubr包中ggboxplot绘制的箱线图须线(常规geom_boxplot的设置不适用),得到了适配方案。现在需要隐藏须线的同时保留ggpubr的实用功能(比如自动统计检验标注),目前基于@Julian_Hn的方案调整后实现了效果,但有两个问题待解决:
- 现有解决方案是否能更高效?
- 如何添加修改x轴数值范围的功能?(试过ggpar、coord_cartesian无效,对ggplot_build的使用不熟悉)
优化后的解决方案
改进版函数代码
ggboxplot_whisker_opt <- function(...) { opts <- list(...) # 处理须线显示开关 whisker <- if ("whisker" %in% names(opts)) { temp <- opts$whisker opts$whisker <- NULL temp } else { TRUE } # 提取kruskal检验参数(按需) kruskal_opts <- if ("kruskal" %in% names(opts) && opts$kruskal) { temp <- opts$kruskal.options opts$kruskal <- NULL opts$kruskal.options <- NULL temp } else { NULL } # 提取轴范围参数(xlim/ylim) axis_lim <- if ("xlim" %in% names(opts)) { temp <- opts$xlim opts$xlim <- NULL temp } else if ("ylim" %in% names(opts)) { temp <- opts$ylim opts$ylim <- NULL temp } else { NULL } # 生成基础ggboxplot pl <- do.call(ggboxplot, opts) # 添加kruskal检验标注 if (!is.null(kruskal_opts)) { pl <- pl + do.call(stat_kruskal_test, kruskal_opts) } # 设置轴范围(关键:在ggplot_build之前执行) if (!is.null(axis_lim)) { orientation <- if ("orientation" %in% names(opts)) opts$orientation else "vertical" pl <- if (orientation == "horizontal") { pl + coord_cartesian(xlim = axis_lim) } else { pl + coord_cartesian(ylim = axis_lim) } } # 隐藏须线 if (!whisker) { pl_build <- ggplot_build(pl) # 将箱线图数据的ymin/ymax设为NA,直接隐藏须线 pl_build$data[[1]]$ymin <- NA pl_build$data[[1]]$ymax <- NA pl <- ggplot_gtable(pl_build) } return(pl) }
应用示例
set.seed(123) x <- rnorm(100) labels <- round(runif(100, 1, 2)) df <- data.frame(labels = labels, value = x) # 定义kruskal检验的标注参数 KO <- list( group.by = "labels", label = "as_detailed_italic", label.y.npc = 0.5, label.x.npc = 0.5 ) # 调用函数,指定隐藏须线、添加均值线、水平方向、统计标注,以及x轴范围 output.plot <- ggboxplot_whisker_opt( df, "labels", "value", col = "labels", legend = "none", whisker = FALSE, add = c("mean"), orientation = "horizontal", kruskal = TRUE, kruskal.options = KO, xlim = c(-1.2, 1.2) ) # 绘制结果 plot(output.plot)
关键优化说明
效率提升:
- 用
do.call直接传递统计检验的参数列表,避免手动逐个提取参数,代码更简洁且扩展性更强(后续添加t.test等只需复用逻辑) - 统一处理参数的提取与移除,减少冗余代码,逻辑更清晰
- 用
轴范围调整问题解决:
- 新增对
xlim/ylim参数的自动识别,根据箱线图的orientation判断是设置x轴还是y轴范围 - 将轴范围设置放在
ggplot_build之前执行,确保coord_cartesian的设置能被正确识别,解决之前设置无效的问题
- 新增对
内容的提问来源于stack exchange,提问作者Jason Whyte
相关产品推荐
相关产品推荐

