Add Text to a ggplot2 Plot Indicating the Results of a Hypothesis Test
For a strip plot or scatterplot produced using the package ggplot2
(e.g., with geom_point), 
add text indicating the results of a hypothesis test comparing locations 
betweeen groups, where the groups are defined based on the unique x-values.
stat_test_text(mapping = NULL, data = NULL, 
    geom = ifelse(text.box, "label", "text"), position = "identity", 
    na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, 
    y.pos = NULL, y.expand.factor = 0.35, test = "parametric", 
    paired = FALSE, test.arg.list = list(), two.lines = TRUE, 
    p.value.digits = 3, p.value.digit.type = "round", 
    location.digits = 1, location.digit.type = "round", 
    nsmall = ifelse(location.digit.type == "round", location.digits, 0), 
    text.box = FALSE, alpha = 1, angle = 0, color = "black", 
    family = "", fontface = "plain", hjust = 0.5, 
    label.padding = ggplot2::unit(0.25, "lines"), 
    label.r = ggplot2::unit(0.15, "lines"), label.size = 0.25, 
    lineheight = 1.2, size = 4, vjust = 0.5, ...)| mapping, data, position, na.rm, show.legend, inherit.aes | See the help file for  | 
| geom | Character string indicating which  | 
| y.pos | Numeric scalar indicating the y-position of the text (i.e., the value of the 
argument  | 
| y.expand.factor | For the case when  | 
| test | A character string indicating whether to use a standard parametric test 
( | 
| paired | For the case of two groups, a logical scalar indicating whether the data 
should be considered to be paired.  The default value is  NOTE: if the argument  | 
| test.arg.list | An optional list of arguments to pass to the function used to test for 
group differences in location.  The default value is an empty list:  
 NOTE: If  | 
| two.lines | For the case of one or two groups, a logical scalar indicating whether the 
associated confidence interval should be be displayed on a second line 
instead of on the same line as the p-value.  The default is  | 
| p.value.digits | An integer indicating the number of digits to use for displaying the 
p-value.  When  | 
| p.value.digit.type | A character string indicating whether the  | 
| location.digits | For the case of one or two groups, an integer indicating the number of digits 
to use for displaying the associated confidence interval.    
When  | 
| location.digit.type | For the case of one or two groups, a character string indicating 
whether the  | 
| nsmall | For the case of one or two groups, an integer passed to the function 
 | 
| text.box | Logical scalar indicating whether to surround the text with a text box (i.e., 
whether to use  | 
| alpha, angle, color, family, fontface, hjust, vjust, lineheight, size | See the help file for  | 
| label.padding, label.r, label.size | See the help file for  | 
| ... | Other arguments passed on to  | 
The table below shows which hypothesis tests are performed based on the number of groups 
and the values of the arguments test and paired.
| Function | ||||
| # Groups | test | paired | Name | Called | 
| 1 | "parametric" | One-Sample t-test | t.test | |
| "nonparametric" | Wilcoxon Signed Rank Test | wilcox.test | ||
| 2 | "parametric" | FALSE | Two-Sample t-test | t.test | 
| TRUE | Paired t-test | t.test | ||
| "nonparametric" | FALSE | Wilcoxon Rank Sum Test | wilcox.test | |
| TRUE | Wilcoxon Signed Rank Test | wilcox.test | ||
| on Paired Differences | ||||
| ≥ 3 | "parametric" | Analysis of Variance | aov | |
| summary.aov | ||||
| "nonparametric" | Kruskal-Wallis Test | kruskal.test | ||
See the help file for geom_text for details about how 
geom_text and geom_label work.
See the vignette Extending ggplot2 at https://cran.r-project.org/package=ggplot2/vignettes/extending-ggplot2.html for information on how to create a new stat.
The function stat_test_text is called by the function geom_stripchart.
Steven P. Millard (EnvStats@ProbStatInfo.com)
Wickham, H. (2016). ggplot2: Elegant Graphics for Data Analysis (Use R!). Second Edition. Springer.
# First, load and attach the ggplot2 package.
  #--------------------------------------------
  library(ggplot2)
  #==========
  # Example 1:
  # Using the built-in data frame mtcars, 
  # plot miles per gallon vs. number of cylinders
  # using different colors for each level of the number of cylinders.
  #------------------------------------------------------------------
  p <- ggplot(mtcars, aes(x = factor(cyl), y = mpg, color = factor(cyl))) + 
    theme(legend.position = "none")
  p + geom_point(show.legend = FALSE) + 
    labs(x = "Number of Cylinders", y = "Miles per Gallon")
  # Now add text indicating the sample size and 
  # mean and standard deviation for each level of cylinder, and 
  # test for the difference in means between groups.
  #------------------------------------------------------------
  dev.new()
  p + geom_point() + 
    stat_n_text() + stat_mean_sd_text() + 
    stat_test_text() + 
    labs(x = "Number of Cylinders", y = "Miles per Gallon")
  
  #==========
  # Example 2:
  # Repeat Example 1, but show text indicating the median and IQR, 
  # and use the nonparametric test.
  #---------------------------------------------------------------
  dev.new()
  p + geom_point() + 
    stat_n_text() + stat_median_iqr_text() + 
    stat_test_text(test = "nonparametric") + 
    labs(x = "Number of Cylinders", y = "Miles per Gallon")
 
  #==========
  # Example 3:
  # Repeat Example 1, but use only the groups with 
  # 4 and 8 cylinders.
  #-----------------------------------------------
  p <- ggplot(subset(mtcars, cyl %in% c(4, 8)), 
    aes(x = factor(cyl), y = mpg, color = cyl)) + 
    theme(legend.position = "none")
  dev.new()
  p + geom_point() + 
    stat_n_text() + stat_mean_sd_text() + 
    stat_test_text() + 
    labs(x = "Number of Cylinders", y = "Miles per Gallon")
  #==========
  # Example 4:
  # Repeat Example 3, but 
  # 1) facet by transmission type,
  # 2) make the text smaller,
  # 3) put the text for the test results in a text box
  #    and make them blue.
  #---------------------------------------------------
  dev.new()
  p + geom_point() + 
    stat_n_text(size = 3) + stat_mean_sd_text(size = 3) + 
    stat_test_text(size = 3, text.box = TRUE, color = "blue") +
    facet_wrap(~ am, labeller = label_both) +  
    labs(x = "Number of Cylinders", y = "Miles per Gallon")
  #==========
  # Clean up
  #---------
  graphics.off()
  rm(p)Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.