密度图上每条线的总观测数

时间:2015-10-01 15:41:26

标签: r counting

我想在密度图上添加每组的观察总数。 我想知道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

时出现错误

非常感谢帮助。

2 个答案:

答案 0 :(得分:3)

简短的回答是否定的,你不能使用stat_summary(...)(虽然我已经说过了,但我相信有人会来并告诉你如何这样做)。

stat_summary(...)需要xy美学。通常,给定的yxstat_summary(...)fun.data使用y为每个x汇总x,然后绘制每个y的结果。

首先,您从未指定x=mpg美学。其次,由于y每个x只有一个x=factor(cyl)。在您引用的帖子中,y=mpgy=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都有一个标签,因为每个xmedian(x) = xlabel="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) 

enter image description here