我们有一些数据代表了许多模型在不同场景下的运行情况。对于单个场景,我们希望显示平滑平均值,其中填充区域代表特定时间点的标准差,而不是平滑拟合的质量。
例如:
d <- as.data.frame(rbind(cbind(1:20, 1:20, 1),
cbind(1:20, -1:-20, 2)))
names(d)<-c("Time","Value","Run")
ggplot(d, aes(x=Time, y=Value)) +
geom_line(aes(group=Run)) +
geom_smooth()
这会生成一个包含两次游程和平滑平均值的图表,但即使两次游程之间的 SD 不断增加,平滑器的条形仍保持相同的大小。我想让平滑器的周围代表给定时间步长的标准偏差。
考虑到许多不同的运行和输出变量,是否有一种非劳动密集型的方法来做到这一点?
嗨,我不确定我是否正确理解你想要什么,但例如,
d <- data.frame(Time=rep(1:20, 4),
Value=rnorm(80, rep(1:20, 4)+rep(1:4*2, each=20)),
Run=gl(4,20))
mean_se <- function(x, mult = 1) {
x <- na.omit(x)
se <- mult * sqrt(var(x) / length(x))
mean <- mean(x)
data.frame(y = mean, ymin = mean - se, ymax = mean + se)
}
ggplot( d, aes(x=Time,y=Value) ) + geom_line( aes(group=Run) ) +
geom_smooth(se=FALSE) +
stat_summary(fun.data=mean_se, geom="ribbon", alpha=0.25)
请注意,mean_se 将出现在 ggplot2 的下一版本中。
如果测量值在 x 上对齐/离散化,则接受的答案才有效。如果是连续数据,您可以使用滚动窗口并添加自定义功能区
iris %>%
## apply same grouping as for plot
group_by(Species) %>%
## Important sort along x!
arrange(Petal.Length) %>%
## calculate rolling mean and sd
mutate(rolling_sd=rollapply(Petal.Width, width=10, sd, fill=NA), rolling_mean=rollmean(Petal.Width, k=10, fill=NA)) %>% # table_browser()
## build the plot
ggplot(aes(Petal.Length, Petal.Width, color = Species)) +
# optionally we could rather plot the rolling mean instead of the geom_smooth loess fit
# geom_line(aes(y=rolling_mean), color="black") +
geom_ribbon(aes(ymin=rolling_mean-rolling_sd/2, ymax=rolling_mean+rolling_sd/2), fill="lightgray", color="lightgray", alpha=.8) +
geom_point(size = 1, alpha = .7) +
geom_smooth(se=FALSE)