how to change x-axis labels in ggboxplot

2019-08-04 05:58发布

I have a data frame including multiple factors. I used ggboxplot to get a box plot with comparisons for different categories. I am not satisfied with the x axis labels. I tried different ways but failed to get what I expected. The code used to create a plot is:

    df <- data.frame(country=sample(LETTERS[1:4], 1000, TRUE),
    rating=round(rnorm(1000,70,15),1),
    sex =rep(c("Female","Male"),500),
    school=sample(c("public","private"),1000,TRUE))
    df$group <- paste(df$school,df$sex,sep=".")
    df <- df[order(df$group),]
    my_comparisons <- list(c("public.Female","public.Male") , c("private.Female","private.Male"))
    library(ggpubr)
    ggboxplot(df, x = "group",y = "rating",
          color = "group", palette = "simpsons",
          add = "jitter",facet.by="country",legend="none", ylab="Rating") +
      theme(strip.text.x=element_text(size=10, color="red", face="bold.italic"),
        axis.text.x = element_text(angle = 45, hjust = 1),
        axis.title.x = element_blank()) +
      stat_compare_means(method = "t.test",comparisons = my_comparisons,
                 label.y = 110,label = "p.signif")

The expected plot looks like: enter image description here

标签: r ggplot2
1条回答
Emotional °昔
2楼-- · 2019-08-04 06:20

This gets you close to what you're looking for (I couldn't figure out the line separator). You may also have to play around with the positioning of the labels to get them just right, as well as sizes.

ggboxplot(df, x = "group",y = "rating",
          color = "group", palette = "simpsons",
          add = "jitter", facet.by="country", legend="none", ylab="Rating") +
scale_x_discrete(labels=rep(c("F","M"),4)) +
theme(strip.text.x=element_text(size=10, color="red", face="bold.italic"),
      axis.title.x = element_blank(),
      plot.margin=unit(c(2,2,15,2), "mm")) +
stat_compare_means(method = "t.test",comparisons = my_comparisons,
                   label.y = 110, label = "p.signif") +
coord_cartesian(ylim=c(20,120), xlim=c(1,4), clip="off") +
annotate("text", x=1.5, y=0, label=c("","","Private","Private")) +
annotate("text", x=3.5, y=0, label=c("","","Public","Public")) +
annotate("text", x=0.5, y=10, label=c("","","Sex",""), hjust=1) +
annotate("text", x=0.5, y=0, label=c("","","School",""), hjust=1)

Additions include scale_x_discrete() to change x-axis labels, plot.margin and coord_cartesian to allow annotations outside the plot area, and annotate for each annotation, where the labels for each facet panel are given as a vector, with blanks for panels which shouldn't get labels.

There may be a cleaner way to do this, but the faceted nature of the plot means that annotations get replicated across facets which you don't want in this case.

查看更多
登录 后发表回答