如何在对数轴的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
相关产品推荐
相关产品推荐

