我有一个看起来有点像这样的数据集:
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()
我想要与该绘图相同的输出,但我只想在每组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)?
答案 0 :(得分: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)
答案 1 :(得分:3)
您可以使用其中一个内置摘要函数mean_sdl
。代码如下所示
ggplot(a, aes(x=x,y=y)) +
stat_summary(fun.y = 'mean', colour = 'blue', geom = 'line')
stat_summary(fun.data = 'mean_sdl', geom = 'ribbon', alpha = 0.2)
答案 2 :(得分:3)
您可以尝试按照Hadley Wickham在ggplot2
:http://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")
这导致此图:
答案 3 :(得分:3)
使用ggplot2 0.9.3.1,以下为我做了诀窍:
ggplot(a, aes(x=x,y=y)) + geom_point() +
stat_summary(fun.data = 'mean_sdl', mult = 1, geom = 'smooth')
'mean_sdl'是Hmisc包的函数'smean.sdl'的实现,而mult-variable给出了显示多少标准偏差(平均值之上和之下)。
有关原始功能的详细信息:
library('Hmisc')
?smean.sdl