用于多次观察的箱形图

时间:2014-09-30 09:54:29

标签: r plot ggplot2 time-series boxplot

我对同一站点的降雨有多次观测,大约14年,数据框架是这样的:

df (from date -01/01/2000)

v1  v2 v3 v4 v5 v6 ........ v20
1   1  2 4   8  9.............. 
1.4 4  3.8..................
1.5 3  1.6....................
1.6 8  .....................
.
.
.
.

至2013年1月31日,即总共5114次观察

其中v1 v2 ... v20是同一点的降雨模拟;我想绘制一个框图,它代表所有观察结果一起的分位数和每月中位数的集体范围。

我可以使用以下方法绘制单个月值的方框图:

df$month<-factor(month.name,levels=month.name)
library(reshape2)
df.long<-melt(df,id.vars="month")
ggplot(df.long,aes(month,value))+geom_boxplot()

但是在这个问题中,由于数据是每天都有,并且有多个观察结果,我不知道从哪里开始。

示例数据

df = data.frame(matrix(rnorm(20), nrow=5114,ncol=100))

如果您想使用zoo对象:

date<-seq(as.POSIXct("2000-01-01 00:00:00","GMT"),as.POSIXct("2013-12-31 00:00:00","GMT"), by="1440 min") 

如果你想要你也可以将它转换成动物园对象

x <- zoo(df, order.by=seq(as.POSIXct("2000-01-01 00:00:00","GMT"), as.POSIXct("2013-12-31 00:00:00","GMT"), by="1440 min"))

2 个答案:

答案 0 :(得分:0)

我不熟悉zoo。所以,我将你的样本转换为数据框。您使用melt()的想法是正确的方法。然后,您需要按月汇总雨量。我认为查找aggregate()和其他选项很好。在这里,我使用dplyrtidyr来排列示例数据。我希望这会让你前进。

### zoo to data frame by @ Joshua Ulrich
### http://stackoverflow.com/questions/14064097/r-convert-between-zoo-object-and-data-frame-results-inconsistent-for-different

zoo.to.data.frame <- function(x, index.name="Date") {
   stopifnot(is.zoo(x))
   xn <- if(is.null(dim(x))) deparse(substitute(x)) else colnames(x)
   setNames(data.frame(index(x), x, row.names=NULL), c(index.name,xn))
}

### to data frame
foo <- zoo.to.data.frame(df)
str(foo)

library(dplyr)
library(tidyr)

### wide to long data frame, aggregate rain amount by Date
ana <- foo %>%
    melt(., id.vars = "Date") %>%
    group_by(Date) %>%
    summarize(rain = sum(value))

### Aggregate rain amount by year and month
bob <- ana %>%
    separate(Date, c("year", "month", "date")) %>%
    group_by(year, month) %>%
    summarize(rain = sum(rain))

### Drawing a ggplot figure
ggplot(data = bob, aes(x = month, y = rain)) +
    geom_boxplot()

答案 1 :(得分:0)

刚刚发现了一种更简单的方法,无论你的答案真的帮助jazzuro

    install.packages("reshape2")
    library(dplyr)
    library(reshape2)
    require(ggplot2)



   df = data.frame(matrix(rnorm(20), nrow=5114,ncol=100))
    x <- zoo(df, order.by=seq(as.POSIXct("2000-01-01 00:00:00","GMT"), 
                                     as.POSIXct("2013-12-31 00:00:00","GMT"), by="1440 min"))
    v<-aggregate(x, as.yearmon, mean)
     months<- rep(1:12,14)
     lol<-data.frame(v,months)

     df.m <- melt(lol, id.var = "months")
     View(df.m)
     p <- ggplot(df.m, aes(factor(months), value))
     p + geom_boxplot(aes(fill = months))