【问题标题】:How to format p-values in ggplot2 `annotate()`—APA style?如何在 ggplot2 `annotate()`-APA 风格中格式化 p 值?
【发布时间】:2021-05-23 12:47:03
【问题描述】:

我想在散点图中添加一个 p 值,同时尊重APA style。这需要两个元素:(a) 斜体 p,以及 (b) 去除前导零(而且:将小于 .001 的值格式化为 <.001>

我们可以使用自定义公式去除前导零

# Formatting formula
format.p <- function(p, precision = 0.001) {
  digits <- -log(precision, base = 10)
  p <- formatC(p, format = 'f', digits = digits)
  p[p == formatC(0, format = 'f', digits = digits)] <- paste0('< ', precision)
  sub("0", "", p)}

# Get p-value
(p = cor.test(mtcars$wt, mtcars$mpg)$p.value)
1.293959e-10

# Format p-value
(p = format.p(p))
"< .001"

# Make plot    
library(ggplot2)
ggplot(mtcars,aes(x=wt,y=mpg)) +
  stat_smooth(geom="line",method="lm")+
  annotate(geom="text",label=paste0("p = ", p),x=4.5,y=25,size=8)

我们也可以实现斜体plike this:

ggplot(mtcars,aes(x=wt,y=mpg)) +
  stat_smooth(geom="line",method="lm") +

(geom="text",label=paste0("italic('p')~'='",p),parse=T,x=4.5,y=25,size=8)

但是请注意,我们丢失了剥离的零(前导零又回来了,而我们不想要它)。知道如何解决这个问题吗?

【问题讨论】:

  • 你可以试试label=sprintf("italic('p')~'%s'", p)
  • 它几乎可以工作了! (斜体 p 同时保留零带)。除了现在我们缺少等号。你会怎么把它放在那里?
  • 你可以在字符串中添加任何额外的文本,但我觉得p = &lt;.001 没有意义,它可以是p = .001p &lt; .001
  • 哦,好的,我明白了!我担心= 符号也会以某种方式错误地斜体,但事实并非如此,所以一切都很好!我猜你是对的,在 &lt; .001 的情况下它没有多大意义,但通常 p 值将是精确的(大于.001)所以在这种情况下我们需要等号.
  • 您想添加解决方案作为答案吗? (或者你更喜欢我吗?)

标签: r ggplot2 decimal p-value plotmath


【解决方案1】:

@rawr 在 cmets 中提供的解决方案(谢谢!)

关键是将label=paste0("italic('p')~'='", p)改为label=sprintf("italic('p')~'%s'", p)

此外,为了避免出现函数同时输出等于和小于符号的情况(例如,p = &lt; .001),我还修改了format.p() 函数以选择&lt;=,具体取决于情况。

这是最终的解决方案:

# Formatting formula
format.p <- function(p, precision = 0.001) {
  digits <- -log(precision, base = 10)
  p <- formatC(p, format = 'f', digits = digits)
  if (p < .001) {
    p = paste0('< ', precision)}
  if (p >= .001) {
    p = paste0('= ', p)    }
  sub("0", "", p)
}

# Get p-value
(p = cor.test(mtcars$wt, mtcars$mpg)$p.value)
1.293959e-10

# Format p-value
(p = format.p(p))
"< .001"

# Make plot    
library(ggplot2)
ggplot(mtcars,aes(x=wt,y=mpg)) +
  stat_smooth(geom="line",method="lm")+
  annotate(geom="text",label=sprintf("italic('p')~'%s'",p),parse=TRUE,x=4.5,y=25,size=8)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多