1

如何堆叠以下示例中的图形?

a<-as.POSIXlt("2013-07-01 00:00:00",origin = "1960-01-01",tz="GMT")
b<-as.POSIXlt("2013-07-08 00:00:00",origin = "1960-01-01",tz="GMT")
woche1<-sample(seq(as.numeric(a),by=60*60,length.out=200),200,T)
woche2<-sample(seq(as.numeric(b),by=60*60,length.out=200),200,T)
times<-c(woche1,woche2)
class(times)<-c("POSIXt","POSIXct") 
times<-as.POSIXlt(times,origin = "1960-01-01",tz="GMT")
key<-sample(LETTERS[1:3],200,T)
df<-data.frame(times=times,order=factor(rep(1:2,each=100)), key=key)
p<-ggplot(df, aes(x=times))
p<-p + geom_area(aes(y = ..count.., fill = key, group = key),stat = "bin",position = 'stack')#,position = 'stack'
p<-p + facet_wrap( ~ order,scales="free_x")
p
4

2 回答 2

3

正如您在评论中链接的问题中已经提到的那样,问题是您的数据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 值)。这可以通过进行所有可能的组合ordertimes2然后key与数据框合并来完成df2。这将使V1缺失时间的 NA 值被替换为 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")

在此处输入图像描述

于 2013-08-16T10:27:38.267 回答
0

确实有点不清楚,但我认为您希望图表彼此重叠,而不是彼此相邻。为此,只需添加nrow = 2到 facet_wrap

p<-p + facet_wrap(~ order,scales="free_x", nrow = 2)

如果这不是你的意思,请告诉你到底想要什么。

于 2013-08-16T10:07:20.710 回答