2013-08-14 4 views
1

다음 예제에서 그래프를 스택하는 방법은 무엇입니까?geom_area 플롯에 누적 된 커브

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 
+1

당신이 질문을 좀 명확 할 경우, 당신은 아마 더 빨리/더 나은 도움/더 얻을 수 있습니다. –

+0

... 구체적으로 말하자면, "스택"이 의미하는 바를 정확히 확장해야 할 필요가 있다고 생각합니다. – joran

+0

http://stackoverflow.com/questions/2363881/ggplot2-geom-area-overlapping-instead-of-stacking과 같은 문제가 있습니다. 다른 해결책이 있습니까? – Klaus

답변

3

의견에 링크 된 질문에서 이미 언급했듯이 데이터에 문제가있는 것은 times이며 각 key마다 다르므로 누적 될 수 없습니다.

문제를 해결하려면 모든 key 값에 대해 동일한 시간 순서를 만들어야합니다. 예를 들어, 현재 각각의 관찰이 속하는 시간 세그먼트 표시하는 기존의 데이터 구조에 추가하는 새로운 컬럼을 times2cut() 함수를 사용하여 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") 

구성 tim.seq했다. 그런 다음 라이브러리 plyr에서 기능 ddply()를 사용

df$times2<-cut(df$times,breaks=tim.seq) 

각 시간 단계의 발생 수를 가지고 데이터를 집계. times2는 플로팅을위한 POSIXct 클래스로 만들어야합니다.

df2<-ddply(df,.(order,times2,key),nrow) 
df2$times2<-as.POSIXct(df2$times2) 

이 데이터 프레임에는 꽤 룩 (0 값)을 얻기 위해 누락 된 기간을 추가해야합니다. 이는 order, times2key의 모든 가능한 조합을 만든 다음 데이터 프레임 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

+0

_ 주석에 링크 된 질문에서 이미 언급했듯이 문제는 데이터 시간이 각 키마다 다르므로 누적 될 수 없다는 것입니다 ._ 예,하지만 시간 간격을 만들기위한 해결책을 찾고 있습니다. 더 유연하게, 어떻게해야합니까? 모든 3 시간 동안? – Klaus

+0

알아, 유연한 솔루션을 생각해 낼 수 있습니까? – Klaus

+0

thx, 한 명령에서 data.frame df2를 시간순으로 정렬하는 기능이 있습니까? df2가 잘 인쇄되지 않기 때문에 df2를 다시 보게됩니다. – Klaus

0

사실 조금 분명하지 않지만 그래프가 서로 옆에있는 대신 서로 위에 있어야한다고 생각합니다. 단지 facet_wrap

페이지 < -p + facet_wrap에 nrow = 2를 추가 이렇게하려면이없는 경우

당신이 무슨 뜻인지, 알려주세요 정확히입니다 (~ 순서 = "free_x", nrow = 2 저울) 네가 원해.