Как уже упоминалось в вопросе, который вы указали в комментарии, проблема в том, что в ваших данных times
различны для каждого key
и поэтому они не могут быть сложены.
Чтобы решить эту проблему, вы должны сделать последовательность времени, которая будет равна всем значениям key
. Например, из tim.seq
, которые состоят из 12 часовых отрезков времени
tim.seq<-seq(as.POSIXlt("2013-07-01 00:00:00",origin = "1960-01-01",tz="GMT"),
as.POSIXlt("2013-07-16 12:00:00",origin = "1960-01-01",tz="GMT"),by="12 hours")
Теперь, используя функцию cut()
добавить новый столбец times2
в существующий фрейм данных, чтобы показать, к которому принадлежит сегменту времени каждому наблюдения.
df$times2<-cut(df$times,breaks=tim.seq)
Затем с помощью функции ddply()
из библиотеки plyr
агрегировать данные, чтобы количество появления каждого временного шага. Добавить times2 должно быть сделано как класс POSIXct для построения графика.
df2<-ddply(df,.(order,times2,key),nrow)
df2$times2<-as.POSIXct(df2$times2)
К этому фрейму данных вы должны добавить также отсутствующие временные периоды, чтобы получить красивый вид (0 значений). Это можно сделать, сделав все возможное сочетание order
, times2
и key
, а затем слияние с фреймом данных df2
. Это заставит значения NA в V1
отсутствующие разы, они заменяются на 0.
df3<-expand.grid(unique(df2$order),unique(df2$times2),unique(df2$key))
colnames(df3)<-c("order","times2","key")
df4<-merge(df2,df3,by=c("times2","order","key"),all=TRUE)
df4$V1[is.na(df4$V1)]<-0
Теперь вы можете получить сложенную площадь участка.
ggplot(df4,aes(x=times2,y=V1,fill=key))+geom_area(stat="identity")+
facet_wrap(~ order,scales="free_x")
Вы, вероятно, получить больше/быстрее/лучше помочь, если вы сделаете этот вопрос немного яснее. –
... в частности, я думаю, вам нужно будет расширить то, что вы подразумеваете под «стек». – joran
У меня такая же проблема, как http://stackoverflow.com/questions/2363881/ggplot2-geom-area-overlapping-instead-of-stacking есть ли другое решение? – Klaus