我想在密度图上添加每组的观察总数。 我想知道stat_summary是否可以用于此。 我试图找到这种情况的一个例子,我找不到它。箱形图只有例子。 例如,我已经按照这个例子:Use stat_summary to annotate plot with number of observations
使代码适应我的情况,即绘制密度图。
n_fun <- function(x){
return(data.frame(y = median(x), label = paste0("n = ",length(x))))
}
ggplot(mtcars, aes(x=mpg, colour=factor(cyl))) +
geom_line(stat="density", aes(linetype=factor(cyl)), size=0.8) +
stat_summary(fun.data = n_fun, geom = "text")
我得到的错误是:
错误:stat_summary需要以下缺少美学:y
只绘制密度图可以正常工作。添加stat_summary
时出现错误非常感谢帮助。
答案 0 :(得分:3)
简短的回答是否定的,你不能使用stat_summary(...)
(虽然我已经说过了,但我相信有人会来并告诉你如何这样做)。
stat_summary(...)
需要x
和y
美学。通常,给定的y
有x
个stat_summary(...)
,fun.data
使用y
为每个x
汇总x
,然后绘制每个y
的结果。
首先,您从未指定x=mpg
美学。其次,由于y
每个x
只有一个x=factor(cyl)
。在您引用的帖子中,y=mpg
和y=median(mpg)
,这就是为什么它在那里工作而不是在这里。
第三,目前尚不清楚您要完成的任务,因为您似乎希望标签位于ggplot(mtcars, aes(x=mpg, colour=factor(cyl))) +
geom_line(stat="density", aes(linetype=factor(cyl)), size=0.8) +
stat_summary(aes(y=mpg),fun.data = n_fun, geom = "text")
。但由于密度图会产生密度,因此标签将全部超标:
x=mpg
请注意,每个y
都有一个标签,因为每个x
,median(x) = x
和label="n = 1"
中只有一个df.lbl <- aggregate(mpg~cyl,mtcars, median)
df.lbl$label <- aggregate(mpg~cyl,mtcars, function(x) paste0("n = ",length(x)))[,2]
ggplot(mtcars, aes(x=mpg, colour=factor(cyl))) +
geom_line(stat="density", aes(linetype=factor(cyl)), size=0.8) +
geom_text(data=df.lbl, aes(label=label, y=0.05), show_guide=FALSE)
案例。不太有用。
这是一种或多或少地做你想要的东西的方法:
{{1}}
答案 1 :(得分:3)
我认为@jlhoward的答案正是你想要的。 如果您需要在同一图表中绘制许多密度,我建议在图例中包含您想要的其他信息(观察次数),而不是在图中。 像这样:
library(ggplot2)
df <- mtcars
df$median <- ave(df$mpg, df$cyl, FUN=median)
df$label <- ave(df$mpg, df$cyl, FUN=function(x)paste0("n = ",length(x)))
df$cyl_group <- paste0(df$cyl, " (", df$label, ")")
ggplot(df, aes(x=mpg, colour=cyl_group)) +
geom_line(stat="density", aes(linetype=cyl_group), size=0.8)