2013-08-14 3 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. Например, из 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, times2 и key, а затем слияние с фреймом данных 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") 

enter image description here

+0

_ Как уже упоминалось в вопросе, который вы связали в комментарии, проблема в том, что в ваших данных время для каждого ключа различно, и поэтому они не могут быть уложены в стек. Да, я знаю, но я ищу решение, чтобы сделать временной интервал более гибким, как я могу это сделать, например для всех 3h? – Klaus

+0

Я знаю, можете ли вы рекомендовать гибкое решение? – Klaus

+0

thx, есть ли функция для сортировки data.frame df2 по времени в одной команде? Я вижу, что вы переупорядочиваете df2, потому что он плохо печатает df2. – Klaus

0

Действительно немного неясно, но я думаю, что вы хотите, чтобы графики были друг на друге, а не рядом друг с другом. Для этого просто добавьте nrow = 2 к facet_wrap

< р-р + facet_wrap (~ порядка, масштабирует = "free_x", nrow = 2)

Если это не то, что вы имеете в виду, пожалуйста скажите то, что именно вы хотите.

Смежные вопросы