How to Add p-values onto ggplot

Using the R function stat_pvalue_manual() from the ggpubr R package, this article shows how to add p-values to ggplots.

The method coord_flip() [in the ggplot2 package] can be used to make horizontal charts.

The option coord.flip = TRUE in the function stat pvalue manual() [in the ggpubr package] must be specified when adding p-values to a horizontal ggplot.

To alter the location of the p-value labels, use the parameters vjust (vertical adjustment) and hjust (horizontal adjustment).

The p-value labels may be partially obscured by the plot top border in some cases. To add more space between labels and the plot top border, use the ggplot2 function scale_y_continuous(expand = expansion(mult = c(0, 0.1))).

The parameter mult = c(0, 0.1) indicates that 0% and 10% spaces are added to the bottom and top of the plot, respectively.

How to Add p-values onto ggplot

Make sure you have the necessary R packages installed:

ggpubr allows you to quickly create publication-ready plots.

For quick statistical analysis, rstatix provides pipe-friendly R functions.

Begin by installing the following packages and load it.

library(ggpubr)
library(rstatix)
df <- ToothGrowth

Convert the word ‘dosage’ into a factor variable.

df$dose <- as.factor(df$dose)
head(df, 3)
   len supp dose
 1  4.2   VC  0.5
 2 11.5   VC  0.5
 3  7.3   VC  0.5

Box plots are easy to make.

bxp <- ggboxplot(df, x = "dose", y = "len", fill = "dose",
                 palette = c("#00AFBB", "#E7B800", "#FC4E07"))

Bar plots showing mean +/- SD

bp <- ggbarplot(df, x = "dose", y = "len", add = "mean_sd", fill = "dose",
                palette = c("#00AFBB", "#E7B800", "#FC4E07"))

Pairwise comparisons

Statistical test

In the following example, we’ll perform T-test using the function t_test() [rstatix package]. It’s also possible to use the function wilcox_test().

stat.test <- df %>% t_test(len ~ dose)
stat.test
 A tibble: 3 x 10
   .y.   group1 group2    n1    n2 statistic    df        p    p.adj p.adj.signif
 * <chr> <chr>  <chr>  <int> <int>     <dbl> <dbl>    <dbl>    <dbl> <chr>      
 1 len   0.5    1         20    20     -6.48  38.0 1.27e- 7 2.54e- 7 ****       
 2 len   0.5    2         20    20    -11.8   36.9 4.40e-14 1.32e-13 ****       
 3 len   1      2         20    20     -4.90  37.1 1.91e- 5 1.91e- 5 ****
stat.test <- stat.test %>% add_xy_position(x = "dose")
bxp + stat_pvalue_manual(stat.test, label = "p.adj.signif", tip.length = 0.01)

Bar plot

stat.test <- stat.test %>% add_xy_position(fun = "mean_sd", x = "dose")
bp + stat_pvalue_manual(stat.test, label = "p.adj.signif", tip.length = 0.01)

Horizontal plots with p-values

Horizontal box plot with p-values using adjusted p-value significance levels as labels.

Decision Tree R Code » Classification & Regression »

stat.test <- stat.test %>% add_xy_position(x = "dose")
bxp +
  stat_pvalue_manual(
    stat.test, label = "p.adj.signif", tip.length = 0.01,
    coord.flip = TRUE
    ) +
  coord_flip()

Horizontal bar plot with p-values

stat.test <- stat.test %>% add_xy_position(fun = "mean_sd", x = "dose")
bp + stat_pvalue_manual(
  stat.test, label = "p.adj.signif", tip.length = 0.01,
  coord.flip = TRUE
  ) +
  coord_flip()

Assigning labels to the adjusted p-values Labeling with ‘p.adj’

stat.test <- stat.test %>% add_xy_position(x = "dose")
bxp +
  stat_pvalue_manual(
    stat.test, label = "p.adj", tip.length = 0.01,
    coord.flip = TRUE
    ) +
  coord_flip()

Adjust the position of p-values using vjust and hjust Change the orientation angle of the p-values Increase the distance between the labels and the plot border.

bxp +
  stat_pvalue_manual(
    stat.test, label = "p.adj", tip.length = 0.01,
    coord.flip = TRUE, angle = 0,
    hjust = 0, vjust = c(0, 1.2, 0)
    ) +
  scale_y_continuous(expand = expansion(mult = c(0.05, 0.3))) +
  coord_flip()

Comparisons with control groups Statistical evaluations

How to Perform Univariate Analysis in R »

stat.test <- df %>% t_test(len ~ dose, ref.group = "0.5")
stat.test
y.   group1 group2    n1    n2 statistic    df        p    p.adj p.adj.signif
* <chr> <chr>  <chr>  <int> <int>     <dbl> <dbl>    <dbl>    <dbl> <chr>      
1 len   0.5    1         20    20     -6.48  38.0 1.27e- 7 1.27e- 7 ****       
2 len   0.5    2         20    20    -11.8   36.9 4.4 e-14 8.8 e-14 **** 

p-values are shown vertically, p-values in a vertical box plot

stat.test <- stat.test %>% add_xy_position(x = "dose")
bxp +
  stat_pvalue_manual(stat.test, label = "p.adj", tip.length = 0.01) +
  scale_y_continuous(expand = expansion(mult = c(0.05, 0.1)))

Vertical bar plot with p-values

stat.test <- stat.test %>% add_xy_position(fun = "mean_sd", x = "dose")
bp +
  stat_pvalue_manual(stat.test, label = "p.adj.signif", tip.length = 0.01) +
  scale_y_continuous(expand = expansion(mult = c(0.05, 0.1)))

P-values in a horizontal box plot

stat.test <- stat.test %>% add_xy_position(x = "dose")
bxp +
  stat_pvalue_manual(
    stat.test, label = "p.adj", tip.length = 0.01,
    coord.flip = TRUE
    ) +
  scale_y_continuous(expand = expansion(mult = c(0.05, 0.1))) +
  coord_flip()

Horizontal bar plot with p-values

stat.test <- stat.test %>% add_xy_position(fun = "mean_sd", x = "dose")
bp +
  stat_pvalue_manual(
    stat.test, label = "p.adj", tip.length = 0.01,
    coord.flip = TRUE
    ) +
  scale_y_continuous(expand = expansion(mult = c(0.05, 0.1))) +
  coord_flip()

Restricted Boltzmann Machine (RBM) »

Conclusion

Using the R function stat pvalue manual() from the ggpubr R package, this article shows how to add p-values to horizontal ggplots.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

seven − 3 =