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

如何在对数轴的ggplot中添加y坐标小于1的p值

在对数轴的ggplot中正确设置ggpubr::stat_pvalue_manual的p值位置

针对你遇到的问题,这里提供两种可行的解决方案,无需使用伪对数转换:

方案1:使用coord_trans()替代scale_y_continuous(trans="log10")

coord_trans()是在绘制阶段对坐标进行对数转换,而非修改原始数据,因此stat_pvalue_manual的y.position可以直接使用原始数据尺度的数值:

library(ggplot2)
library(ggpubr)

df <- data.frame("group" = rep(c("A", "B", "C", "D", "E"), each = 5), 
                 "value" = exp(seq(-10,-9, length.out = 25)))

stat_df <- ggpubr::compare_means(formula = value ~ group, data = df, method = "wilcox.test")[1:3,]

p <- ggplot(data = df, aes(x = group, y = value)) +
    geom_boxplot() +
    ggpubr::stat_pvalue_manual(data = stat_df, y.position = 1e-4, step.increase = 0) +
    coord_trans(y = "log10")

plot(p)

方案2:保留scale_y_continuous(trans="log10"),直接使用转换后的坐标值

如果坚持使用scale的对数转换,可将y.position设置为目标位置的log10值,并用I()包裹以避免函数重复转换:

p <- ggplot(data = df, aes(x = group, y = value)) +
    geom_boxplot() +
    ggpubr::stat_pvalue_manual(data = stat_df, y.position = I(-4), step.increase = 0) +
    scale_y_continuous(trans = "log10")

plot(p)

问题原因说明

  • 使用scale_y_continuous(trans="log10")时,ggplot会对所有y轴相关数据(包括stat_pvalue_manual的y.position)先执行log10转换。若直接输入小于1的原始数值(如1e-4),ggpubr内部的逻辑可能错误处理转换后的值,导致p值位置偏移;输入负数则会因log10转换产生NaN,触发警告并丢失p值。
  • coord_trans()仅修改坐标显示尺度,不触碰原始数据,因此y.position可以直接匹配你期望的原始数值位置,避免转换逻辑冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:25:23