如何使用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]]) ))
这是对此问题的跟进:How to add a number of observations per group and use group mean in ggplot2 boxplot?我可以使用stat_summary
来计算和显示观察次数,但我无法找到包含{{}的方法1 {}在n =
输出中。似乎stat_summary
可能是进行此类标记的最有效方法,但欢迎采用其他方法。
答案 0 :(得分:24)
您可以在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")
答案 1 :(得分:9)
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))
但是,当然,即使这样做也不需要完成上述任务。