15

如何使用变量在哪里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]]) )) 

这是对这个问题的跟进:如何在 ggplot2 boxplot 中为每组添加多个观察值并使用组均值?我可以用它stat_summary来计算和显示观察的数量,但我无法找到一种方法来包含n =stat_summary输出中。似乎stat_summary可能是进行此类标记的最有效方法,但欢迎使用其他方法。

4

2 回答 2

32

您可以制作自己的函数以在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")

在此处输入图像描述

于 2013-03-30T16:23:55.687 回答
10

大多数东西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))   

但当然,即使这样也不需要完成上述操作。

于 2013-03-30T16:36:53.743 回答