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

如何修改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)

关键优化说明

  1. 效率提升:

    • 用do.call直接传递统计检验的参数列表,避免手动逐个提取参数,代码更简洁且扩展性更强(后续添加t.test等只需复用逻辑)
    • 统一处理参数的提取与移除,减少冗余代码,逻辑更清晰
  2. 轴范围调整问题解决:

    • 新增对xlim/ylim参数的自动识别,根据箱线图的orientation判断是设置x轴还是y轴范围
    • 将轴范围设置放在ggplot_build之前执行,确保coord_cartesian的设置能被正确识别,解决之前设置无效的问题

内容的提问来源于stack exchange,提问作者Jason Whyte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:50:31