Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Duplicated annotation in ggplot2

I’m trying to plot two different results from tests in the boxplot below. The problem is that it is duplicating my annotation.

  • Plot:

myphoto

  • The data:

These are the results of two tests (E, P) that were taken by two groups (I and II) and each group’s score.
I want to plot the difference between scores in the plot, but I can’t get it right.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

> head(df)
  ID GROUP TEST SCORE
1  1     I    E     0
2  2     I    P     3
3  3     I    E     3
4  4     I    P    11
5  5     I    P     8
6  6     I    E     0


#code:

ggplot(df, aes(x =GROUP, y = SCORE, fill = TEST)) +
  stat_boxplot(geom = "errorbar",
               width = 0.15) +
  geom_boxplot(aes(fill = TEST), outlier.colour = "black", outlier.shape = 19,
               outlier.size= 2, notch = T) +
  stat_summary(fun = mean, geom = "point", shape = 20, size= 3, 
               color= "black", show.legend = FALSE) +
  facet_wrap(~ TEST) +
  labs(x = "Group",
       y = "Score") +
  
 annotate("text",
            x = 1.2,
            y = max(df$SCORE), 
            label = expression(paste(italic("t"), "(", 97, ") = ", 9.45, ", ", italic("p"), " < .001")), 
            parse = TRUE, hjust = 0, vjust = 1, size = 4, color = "black")
  • Supposing that I wanted to annotate "t (97) = 9.45, p < .0001" on the right and "W = 5253.50, p < .001" on the left (being it the p italicized). How can I do it?

** Note: I saw it here that annotate() duplicates it, but I couldn’t get the italics without it…

  • dataset:
structure(list(ID = 1:525, GROUP = structure(c(1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), levels = c("I", "II"), class = "factor"), 
    TEST = structure(c(2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 
    1L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 
    1L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 
    1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 
    2L, 1L, 2L, 2L, 1L), levels = c("P", "E"), class = "factor"), 
    SCORE = c(0L, 3L, 3L, 11L, 8L, 0L, 8L, 0L, 1L, 7L, 0L, 6L, 
    2L, 6L, 4L, 9L, 7L, 4L, 15L, 4L, 9L, 1L, 7L, 1L, 0L, 4L, 
    1L, 3L, 2L, 9L, 2L, 4L, 0L, 7L, 1L, 10L, 12L, 1L, 9L, 0L, 
    6L, 2L, 8L, 4L, 9L, 0L, 10L, 0L, 6L, 10L, 2L, 7L, 0L, 5L, 
    5L, 10L, 1L, 10L, 1L, 4L, 2L, 10L, 0L, 6L, 9L, 1L, 11L, 1L, 
    7L, 7L, 12L, 0L, 4L, 11L, 3L, 7L, 12L, 12L, 0L, 8L, 1L, 12L, 
    11L, 1L, 10L, 2L, 13L, 3L, 9L, 7L, 9L, 3L, 12L, 4L, 10L, 
    8L, 2L, 5L, 5L, 12L, 7L, 11L, 0L, 6L, 1L, 7L, 0L, 10L, 1L, 
    6L, 0L, 5L, 10L, 0L, 2L, 8L, 1L, 10L, 7L, 1L, 10L, 0L, 0L, 
    5L, 1L, 11L, 4L, 1L, 5L, 1L, 10L, 8L, 0L, 0L, 6L, 0L, 10L, 
    0L, 7L, 1L, 0L, 0L, 1L, 0L, 1L, 11L, 0L, 7L, 0L, 8L, 2L, 
    7L, 3L, 10L, 3L, 12L, 2L, 9L, 0L, 3L, 5L, 12L, 6L, 14L, 1L, 
    9L, 1L, 10L, 1L, 8L, 1L, 11L, 0L, 4L, 2L, 11L, 0L, 9L, 1L, 
    9L, 7L, 1L, 8L, 1L, 8L, 0L, 11L, 3L, 11L, 9L, 11L, 2L, 9L, 
    1L, 8L, 2L, 9L, 0L, 6L, 3L, 7L, 1L, 7L, 4L, 11L, 2L, 7L, 
    3L, 9L, 0L, 5L, 0L, 5L, 5L, 11L, 4L, 14L, 2L, 6L, 3L, 6L, 
    2L, 6L, 5L, 11L, 9L, 3L, 11L, 0L, 9L, 0L, 0L, 0L, 0L, 4L, 
    13L, 0L, 6L, 2L, 6L, 1L, 7L, 0L, 7L, 0L, 5L, 2L, 4L, 9L, 
    12L, 2L, 11L, 3L, 9L, 5L, 9L, 0L, 6L, 9L, 4L, 13L, 12L, 6L, 
    15L, 5L, 12L, 2L, 12L, 12L, 1L, 5L, 4L, 8L, 3L, 9L, 7L, 13L, 
    4L, 10L, 6L, 12L, 1L, 11L, 7L, 12L, 10L, 13L, 4L, 14L, 6L, 
    11L, 2L, 14L, 1L, 9L, 4L, 9L, 1L, 11L, 1L, 8L, 11L, 3L, 12L, 
    3L, 11L, 4L, 7L, 1L, 5L, 1L, 11L, 8L, 12L, 0L, 8L, 2L, 10L, 
    6L, 12L, 0L, 4L, 2L, 10L, 7L, 13L, 7L, 13L, 11L, 14L, 2L, 
    10L, 7L, 13L, 3L, 11L, 6L, 10L, 1L, 10L, 3L, 12L, 7L, 14L, 
    5L, 9L, 1L, 9L, 4L, 12L, 10L, 4L, 8L, 12L, 4L, 8L, 7L, 15L, 
    6L, 11L, 13L, 10L, 14L, 2L, 11L, 2L, 10L, 4L, 11L, 4L, 14L, 
    2L, 9L, 2L, 12L, 1L, 9L, 9L, 1L, 9L, 5L, 11L, 1L, 9L, 1L, 
    11L, 6L, 14L, 4L, 13L, 10L, 4L, 11L, 15L, 12L, 2L, 13L, 1L, 
    11L, 0L, 8L, 1L, 9L, 2L, 0L, 11L, 6L, 15L, 5L, 9L, 10L, 14L, 
    7L, 15L, 5L, 13L, 6L, 13L, 1L, 5L, 1L, 11L, 8L, 12L, 1L, 
    7L, 6L, 13L, 3L, 12L, 4L, 12L, 6L, 15L, 1L, 10L, 4L, 12L, 
    3L, 10L, 3L, 11L, 13L, 1L, 9L, 1L, 11L, 8L, 13L, 7L, 2L, 
    8L, 2L, 10L, 2L, 9L, 3L, 11L, 5L, 11L, 3L, 11L, 2L, 7L, 3L, 
    9L, 12L, 2L, 13L, 1L, 12L, 0L, 9L, 1L, 11L, 11L, 11L, 4L, 
    11L, 5L, 12L, 12L, 10L, 6L, 11L, 6L, 11L, 12L, 14L, 5L, 14L, 
    10L, 14L, 7L, 11L, 2L, 9L, 4L, 12L, 5L, 11L, 2L, 10L, 2L, 
    2L, 7L, 1L, 10L, 0L, 14L, 6L, 14L, 10L, 11L, 11L, 8L, 15L, 
    1L, 9L, 12L, 7L, 12L, 4L, 3L, 10L)), class = "data.frame", row.names = c(NA, 
-525L))

>Solution :

You could create a little dummy data frame which includes the TEST variable, then draw the annotation using geom_richtext from ggtext:

library(ggtext)

ggplot(df, aes(x = GROUP, y = SCORE, fill = TEST)) +
  stat_boxplot(geom = "errorbar",
               width = 0.15) +
  geom_boxplot(aes(fill = TEST), outlier.colour = "black", outlier.shape = 19,
               outlier.size= 2, notch = T) +
  stat_summary(fun = mean, geom = "point", shape = 20, size= 3, 
               color= "black", show.legend = FALSE) +
  facet_wrap(~ TEST) +
  labs(x = "Group",
       y = "Score") +
  geom_richtext(data = data.frame(x = 1.5, SCORE = 16, 
                                  TEST = factor(c('E', 'P'), c('P', 'E')),
                                  label = c('t(97) = 9.45, <i>p</i> < 0.001',
                                            'W = 5253.50, <i>p</i> < 0.001')),
                aes(x = x, label = label), fill = NA, label.colour = NA) 

enter image description here

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading