简体   繁体   中英

how to change x-axis labels in ggboxplot

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: 在此处输入图片说明

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM