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 値)。これは、 のすべての可能な組み合わせを作成してからorder、データ フレームtimes2keyマージすることで実行できます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")

ここに画像の説明を入力

于 2013-08-16T10:27:38.267 に答える