使用具有置信区间的ggplot绘制时间序列

Leo*_*ach 4 r ggplot2

如果我有一个带有时间序列的数据表,其中每个时间戳都有多个观测值,是否有直接方法以均值和间隔来绘制该数据集?

例如,创建数据集:

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)
Run Code Online (Sandbox Code Playgroud)

每个时间戳都有多个观察结果。我希望剧情看起来像这样:

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)
Run Code Online (Sandbox Code Playgroud)

这行得通,但似乎很多行可以简化一些事情。例如,如果我正在做箱线图,则可以在一个更简单的ggplot调用中执行此操作:

ggplot(dt)+
  aes(x = factor(Time), y = Value)+
  geom_boxplot()
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助!

www*_*www 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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如果仍要平均用90首10个百分点,就需要设计一个函数返回yyminymax你的数值数据

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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

或作为lististaire的评论:

ggplot(dt, aes(Time, Value)) + 
  geom_smooth(stat = 'summary', fun.data = mean_cl_quantile)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 不,将其与stat_summary一起使用,例如ggplot(dt,aes(Time,Value))+ geom_smooth(stat ='summary',fun.data = function(y)data.frame(ymin =分位数(y,。 1),y =平均值(y),ymax =分位数(y,.9)))。几何图形只是功能区和线条的组合;stat_smooth`称为模型。 (3认同)