Ben*_*Ben 11 plot r graph ggplot2
如何使用where 变量stat_summary来标记绘图?这是所需输出的示例:n = xx

我可以用这个相当低效的代码制作上面的情节:
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]]) ))
Run Code Online (Sandbox Code Playgroud)
这是对这个问题的跟进:如何在ggplot2 boxplot中为每个组添加一些观察并使用组均值?我可以stat_summary用来计算和显示观察的数量,但我还没有找到一种方法来包含n =在stat_summary输出中.似乎stat_summary可能是进行此类标记的最有效方法,但欢迎使用其他方法.
Did*_*rts 25
你可以让自己的功能在里面使用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")
Run Code Online (Sandbox Code Playgroud)

大多数东西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)))
Run Code Online (Sandbox Code Playgroud)

nlables:sapply您可以简单地使用:而不是您的声明:
nlabels <- table(mtcars$cyl)
Run Code Online (Sandbox Code Playgroud)
请注意,您当前的代码采用上述方法,转换它,转置它,然后遍历每一行只是为了逐个获取值,然后将它们放回一个单独的向量中.
如果你真的想要它们作为一个无量纲的整数向量,请使用 c()
nlabels <- c(table(mtcars$cyl))
Run Code Online (Sandbox Code Playgroud)
但是,当然,即使这不是完成上述任务所必需的.