用每个 bar/group 的观察次数注释 ggplot boxplot 方面

Annotate ggplot boxplot facets with number of observations per bar/group

我已经查看了类似这些的其他问题 (Annotate ggplot2 facets with number of observations per facet),但没有找到对带有 facets 的箱线图的单个条形图进行注释的答案。

这是我创建箱线图的示例代码:

require(ggplot2)
require(plyr)
mms <- data.frame(deliciousness = rnorm(100),
                  type=sample(as.factor(c("peanut", "regular")), 
                              100, replace=TRUE),
                  color=sample(as.factor(c("red", "green", "yellow", "brown")), 
                               100, replace=TRUE))

ggplot(mms, aes(x=type, y=deliciousness, fill=type)) + 
   geom_boxplot(notch=TRUE)+
   facet_wrap(~ color,nrow=3, scales = "free")+
   xlab("")+
   scale_fill_manual(values = c("coral1", "lightcyan1", "olivedrab1"))+
   theme(legend.position="none")

这里是对应的情节:

现在我想为颜色的每个方面单独注释每组的观察次数 (peanut/regular),如我的绘图所示:

我已经做的是用以下代码总结每种颜色和每组 (peanut/regular) 的 dpyr 观察次数:

 mms.cor <- ddply(.data=mms, 
                  .(type,color), 
                  summarize, 
                  n=paste("n =", length(deliciousness)))

但是,我不知道如何将这个数据摘要添加到 ggplot 中。如何做到这一点?

使用 dplyrggplot2 尝试这种方法。您可以使用 mutate() 构建标签,然后根据 deliciousness 的最大值格式化为只有一个值。之后 geom_text() 可以根据需要启用文本。这里的代码:

library(dplyr)
library(ggplot2)
#Data
mms <- data.frame(deliciousness = rnorm(100),
                  type=sample(as.factor(c("peanut", "regular")), 
                              100, replace=TRUE),
                  color=sample(as.factor(c("red", "green", "yellow", "brown")), 
                               100, replace=TRUE))
#Plot
mms %>% group_by(color,type) %>% mutate(N=n()) %>%
  mutate(N=ifelse(deliciousness==max(deliciousness,na.rm=T),paste0('n=',N),NA)) %>%
  ggplot(aes(x=type, y=deliciousness, fill=type,label=N)) + 
  geom_boxplot(notch=TRUE)+
  geom_text(fontface='bold')+
  facet_wrap(~ color,nrow=3, scales = "free")+
  xlab("")+
  scale_fill_manual(values = c("coral1", "lightcyan1", "olivedrab1"))+
  theme(legend.position="none")

输出: