library(data.table)
library(ggplot2)

N <- 30
set.seed(17)
dat <- data.table(   id=rep(c("A", "B"), each=N/2)
                , Group=sample(c("G1", "G2", "G3"), N, TRUE)
                , Cat1 =sample(c("rst", "uvw"), N, TRUE)
                , Cat2 =sample(c("ZZ", "SS"), N, TRUE)
                )
dat[, value := rnorm(.N), by=list(Cat1, Cat2, Group)]
dat[, id.mean := mean(value), by=list(Cat1)]


P <- ggplot(data=dat, aes(x=Group, color=Group)) + geom_boxplot(aes(y=value)) + theme(axis.text.x=element_blank())
P + geom_text(aes(y=id.mean, color=Cat1, label=Cat1))+ scale_color_discrete(breaks=c("G1", "G2", "G3"))