Add multiple labels on ggplot2 boxplot

20,611

Solution 1

You should probably save the aggregate data on a separate object for clarity and use position=position_dodge() in the geom_text() options:

aging.sum = aggregate(Age ~ Group + Sex, aging, mean)

ggplot(data=aging, aes(x=Group, y=Age, fill=Sex)) + 
  geom_boxplot(position=position_dodge(width=0.8)) +
  geom_text(data=aging.sum, aes(label=round(Age,1), y = Age + 3), 
            size=6, position=position_dodge(width=0.8))

Play with the width till you are satisfied with the results. Notice that I put fill=Sex in the global aes definition so it applies to the text labels as well.

Edit: On @user20650 suggestion added position_dodge() to geom_boxplot() for proper alignment.

Solution 2

If you are wanting the mean age for gender and group then gender need to be in the aggregate statement.

Example - is this what you want?

p <- ggplot(data=mtcars, aes(x=factor(vs), y=mpg, fill=factor(am))) +
                            geom_boxplot(position = position_dodge(width=0.9)) 

a <- aggregate(mpg ~ vs + am , mtcars, function(i) round(mean(i)))

p +  geom_text(data = a, aes(label = mpg), 
                                  position = position_dodge(width=0.9))

Share:
20,611
Alba
Author by

Alba

Updated on July 09, 2022

Comments

  • Alba
    Alba almost 2 years

    I am trying to add labels with the mean age of the males and females on this boxplot for 2 groups. So far I was only able to do it by group but not by gender and group.

    My data frame:

    Age=c(60, 62, 22, 24, 21, 23) 
    Sex=c("f", "m", "f","f","f","m")
    Group=c("Old", "Old", "Young", "Young", "Young", "Young")
    
    aging<-data.frame(Age, Sex, Group)
    

    And the command for the plot:

    ggplot(data=aging, aes(x=Group, y=Age))+geom_boxplot(aes(fill=Sex))
    +geom_text(data =aggregate(Age~Group,aging, mean), 
    aes(label =round(Age,1), y = Age + 3), size=6)
    

    Graph with 2 groups and 2 genders per group

  • user20650
    user20650 about 10 years
    @Alba; you can use the vjust argument in the geom_text call to tweak the y position of the text ie. add vjust = 1.
  • Alba
    Alba about 10 years
    Thank you, Ilir above and you gave me the answer I was looking for