使用stat_summary注释情节与观测的数量(Use stat_summary to annot

2019-08-18 07:52发布

如何使用stat_summary标记,容积n = x ,其中是x变量? 以下是所希望的输出的一个示例:

我可以做这个,而低效的代码,上面的情节:

nlabels <- sapply(1:length(unique(mtcars$cyl)), function(i) as.vector(t(as.data.frame(table(mtcars$cyl))[,2][[i]])))
ggplot(mtcars, aes(factor(cyl), mpg, label=rownames(mtcars))) +
  geom_boxplot(fill = "grey80", colour = "#3366FF") + 
  geom_text(aes(x = 1, y = median(mtcars$mpg[mtcars$cyl==sort(unique(mtcars$cyl))[1]]), label = paste0("n = ",nlabels[[1]]) )) +
  geom_text(aes(x = 2, y = median(mtcars$mpg[mtcars$cyl==sort(unique(mtcars$cyl))[2]]), label = paste0("n = ",nlabels[[2]]) )) +
  geom_text(aes(x = 3, y = median(mtcars$mpg[mtcars$cyl==sort(unique(mtcars$cyl))[3]]), label = paste0("n = ",nlabels[[3]]) )) 

这是一个跟进这个问题: 如何添加了一些每个组和使用组意见的GGPLOT2箱线图是什么意思? 在那里我可以用stat_summary计算并显示观测次数,但我一直没能找到一种方法,包括n =stat_summary输出。 好像stat_summary可能做这种标签的最有效的方式,但其他的方法是受欢迎的。

Answer 1:

你可以让你自己的函数内部使用stat_summary() 这里n_fun计算地方的y值作为median()然后添加label=在于包括n=和观察的数目。 使用是很重要的data.frame()而不是c()因为paste0()会产生字符,但y值是数字,但c()将会使双方的性格。 然后在stat_summary()使用此功能和geom="text" 。 这将确保每个x值位置和标签是从这一层面的数据只发。

n_fun <- function(x){
  return(data.frame(y = median(x), label = paste0("n = ",length(x))))
}

ggplot(mtcars, aes(factor(cyl), mpg, label=rownames(mtcars))) +
  geom_boxplot(fill = "grey80", colour = "#3366FF") + 
  stat_summary(fun.data = n_fun, geom = "text")



Answer 2:

在大多数事情R是矢量,所以你可以充分利用这一点。

nlabels <- table(mtcars$cyl)

#  To create the median labels, you can use by
meds <- c(by(mtcars$mpg, mtcars$cyl, median))

ggplot(mtcars, aes(factor(cyl), mpg, label=rownames(mtcars))) +
   geom_boxplot(fill = "grey80", colour = "#3366FF") + 
   geom_text(data = data.frame(), aes(x = names(meds) , y = meds, 
            label = paste("n =", nlabels)))


关于nlables

而不是你的sapply声明,你可以简单地使用:

nlabels <- table(mtcars$cyl)

请注意,您的当前代码正在上面,将其转换,调换,然后在每行只迭代一个一个抢的值,然后把他们重新走到一起成为一个载体。

如果你真的希望他们作为一个非整数尺寸向量,使用c()

nlabels <- c(table(mtcars$cyl))   

但当然,这甚至不需要完成上述。



文章来源: Use stat_summary to annotate plot with number of observations