如果我有一个带有时间序列的数据表,其中每个时间戳都有多个观测值,是否有直接方法可以用均值和间隔来绘制该数据集?
例如,创建数据集:
dt <- lapply(seq(1,10),function(x) {
dt <- data.table(Time = seq(1,100),
Value = seq(1,100)* 3 + rnorm(100,5,20))
})
dt <- rbindlist(dt,idcol = 'Run')
ggplot(dt,aes(Time,Value,group = Run)) +
geom_line(size = 0.1,alpha = 0.5)
每个时间戳都有多个观察结果。我希望情节看起来像这样:
ggplot(dt[,list(Value = mean(Value),
MaxValue = quantile(Value, 0.9),
MinValue = quantile(Value, 0.1)),
list(Time)])+
aes(x = Time, y = Value,ymin = MinValue,ymax = MaxValue)+
geom_line()+
geom_ribbon(alpha = 0.3)
这行得通,但似乎很多行可以简化一些事情。例如,如果我正在做箱线图,则可以通过更简单的ggplot调用来做到这一点:
ggplot(dt)+
aes(x = factor(Time), y = Value)+
geom_boxplot()
谢谢您的帮助!
答案 0 :(得分:5)
我们可以按以下方式使用stat_summary
。
ggplot(dt,aes(Time, Value)) +
stat_summary(geom = "line", fun.y = mean) +
stat_summary(geom = "ribbon", fun.data = mean_cl_normal, alpha = 0.3)
如果您仍然希望均值分别为90%和10%,则需要设计一个返回y
的函数,
ymin
和ymax
的数字数据
mean_cl_quantile <- function(x, q = c(0.1, 0.9), na.rm = TRUE){
dat <- data.frame(y = mean(x, na.rm = na.rm),
ymin = quantile(x, probs = q[1], na.rm = na.rm),
ymax = quantile(x, probs = q[2], na.rm = na.rm))
return(dat)
}
ggplot(dt,aes(Time, Value)) +
stat_summary(geom = "line", fun.y = mean) +
stat_summary(geom = "ribbon", fun.data = mean_cl_quantile, alpha = 0.3)
或作为lististaire的评论:
ggplot(dt, aes(Time, Value)) +
geom_smooth(stat = 'summary', fun.data = mean_cl_quantile)