Incorrect p-value position on ggplots using rstatix

2.1k views Asked by At

I am having trouble placing the p-values in the correct position on the y axis of a ggplot using rstatix. I can get the example provided on the package author's blog to work fine, but when I change the values, the positions are incorrect. Here is the working version:

library(tidyverse)
library(rstatix)

##Example provided by the package author which works correctly

df <- ToothGrowth%>%
  as_tibble()

#Check df
df

#Stats calculation
stat.test <- df %>%
  group_by(dose) %>%
  t_test(len ~ supp) %>%
  adjust_pvalue(method = "bonferroni") %>%
  add_significance()

# Make facet and add p-values
stat.test <- stat.test %>% add_xy_position(x = "supp", fun = "max")

#Check p value positions - y.position looks good
stat.test

#Plot
ggplot(df, aes(x = supp, y = len)) +
  geom_boxplot() +
  geom_jitter() +
  facet_wrap( ~ dose, scales = "free") +
  stat_pvalue_manual(stat.test, hide.ns = F,
                     label = "{p.adj}")

However, when I change the values, the position of the p values are too high.

## My example which plots incorrectly

##--- This is a very inelegant way to change the values!!
df <- ToothGrowth %>%
  mutate(helper = paste0(supp, dose))

df$RecordingNo <- ave(seq.int(nrow(df)), df$helper, FUN = seq_along)

df <- df %>%
  select(-helper) %>%
  pivot_wider(names_from = c(dose), values_from = len) %>%
  mutate(`0.5` = `0.5` * 0.1) %>%
  mutate(`2` = `2` * 10) %>%
  select(-RecordingNo) %>%
  pivot_longer(-supp) %>%
  rename(len = value, dose = name) %>%
  mutate(dose = as_factor(dose)) %>%
  as_tibble()

#Check df
df

##------

#This code is exactly the same as the working code above.

#Stats calculation
stat.test <- df %>%
  group_by(dose) %>%
  t_test(len ~ supp) %>%
  adjust_pvalue(method = "bonferroni") %>%
  add_significance()

# Make facet and add p-values
stat.test <- stat.test %>% add_xy_position(x = "supp", fun = "max")

#Check p value positions - y.position looks incorrect
stat.test

ggplot(df, aes(x = supp, y = len)) +
  geom_boxplot() +
  geom_jitter() +
  facet_wrap( ~ dose, scales = "free") +
  stat_pvalue_manual(stat.test, hide.ns = F,
                     label = "{p.adj}")

I guess there is a difference in the second dataframe which is causing the problems, but I can't figure it out. Thanks!

1

There are 1 answers

0
Damian On BEST ANSWER

Like the scales option on facet_wrap, there is a scales option on add_xy_position that controls the p value position . As I am using "facet_wrap(...,scales = "free")" I should use add_xy_position(...,scales = "free") to make sure the positions match.

In my example:

stat.test <- stat.test %>% add_xy_position(x = "supp", fun = "max",scales = "free")

ggplot(df, aes(x = supp, y = len)) +
  geom_boxplot() +
  geom_jitter() +
  facet_wrap( ~ dose, scales = "free") +
  stat_pvalue_manual(stat.test, hide.ns = F,
                     label = "{p.adj}")

Answer from author's Github page.