如何在以下示例中堆叠图形?
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
答案 0 :(得分:3)
正如您在评论中链接的问题中已经提到的,问题是您的数据times
对于每个key
都有所不同,因此它们无法堆叠。
要解决此问题,您必须为所有key
值创建相等的时间顺序。例如,由{12}时间段组成的tim.seq
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
合并来完成。这将使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")
答案 1 :(得分:0)
确实有点不清楚,但我认为你希望图表在彼此之上而不是彼此相邻。要执行此操作,只需将nrow = 2
添加到facet_wrap
p&lt; -p + facet_wrap(~order,scales =“free_x”,nrow = 2)
如果这不是您的意思,请说明您想要的是什么。