geom_area图中的堆积曲线

时间:2013-08-14 16:25:03

标签: r ggplot2

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

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

2 个答案:

答案 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值)。这可以通过将ordertimes2key进行所有可能的组合,然后与数据框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")

enter image description here

答案 1 :(得分:0)

确实有点不清楚,但我认为你希望图表在彼此之上而不是彼此相邻。要执行此操作,只需将nrow = 2添加到facet_wrap

即可

p&lt; -p + facet_wrap(~order,scales =“free_x”,nrow = 2)

如果这不是您的意思,请说明您想要的是什么。