使用ggplot2绘制每x值的数据集的平均值和sd

nau*_*101 8 r ggplot2

我有一个看起来像这样的数据集:

a <- data.frame(x=rep(c(1,2,3,5,7,10,15,20), 5),
                y=rnorm(40, sd=2) + rep(c(4,3.5,3,2.5,2,1.5,1,0.5), 5))
ggplot(a, aes(x=x,y=y)) + geom_point() +geom_smooth()
Run Code Online (Sandbox Code Playgroud)

图输出

我想要与该绘图相同的输出,但不是平滑曲线,我只想在每组x值的均值/ sd值之间取线段.该图应该与上图类似,但是锯齿状,而不是弯曲的.

我试过这个,但它失败了,即使x值不是唯一的:

ggplot(a, aes(x=x,y=y)) + geom_point() +stat_smooth(aes(group=x, y=y, x=x))
geom_smooth: Only one unique x value each group.Maybe you want aes(group = 1)?
Run Code Online (Sandbox Code Playgroud)

mne*_*nel 8

?stat_summary 是你应该看到的.

这是一个例子

# functions to calculate the upper and lower CI bounds
uci <- function(y,.alpha){mean(y) + qnorm(abs(.alpha)/2) * sd(y)}
lci <- function(y,.alpha){mean(y) - qnorm(abs(.alpha)/2) * sd(y)}
ggplot(a, aes(x=x,y=y))  + stat_summary(fun.y = mean, geom = 'line', colour = 'blue') + 
            stat_summary(fun.y = mean, geom = 'ribbon',fun.ymax = uci, fun.ymin = lci, .alpha = 0.05, alpha = 0.5)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


smi*_*lig 3

您可以尝试按照 Hadley Wickham 在网站上的建议编写汇总函数ggplot2http://had.co.nz/ggplot2/stat_summary.html。将他的建议应用到您的代码中:

p <- qplot(x, y, data=a)

stat_sum_df <- function(fun, geom="crossbar", ...) { 
 stat_summary(fun.data=fun, colour="blue", geom=geom, width=0.2, ...) 
} 

p + stat_sum_df("mean_cl_normal", geom = "smooth") 
Run Code Online (Sandbox Code Playgroud)

结果如下图所示:

在此输入图像描述