【问题标题】:box plot for multiple observations多次观察的箱线图
【发布时间】:2014-09-30 09:54:29
【问题描述】:

我对同一个站点的降雨量进行了大约 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))

如果您想使用动物园对象:

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"))

【问题讨论】:

  • 你能不能dput() 一些df 的最小例子,这样想要回答的人就不必生成它了吗?
  • 嘿@ilir 示例数据集是:df = data.frame(matrix(rnorm(20), nrow=5114,ncol=100)) 其中每列代表模拟,行代表每日数据.谢谢你的建议。
  • 这是我发布的一个好问题;我相信很多做模拟的人会发现它很有用,请有人尝试找到解决方案。非常感谢。
  • 您会考虑提供更好的样本数据吗?例如,每列包含什么?你可能会说雨量。但是,哪一年?哪个月?您只期待melt(),但可能还有更多事情要做来安排您的数据集。
  • @user197393 努力并正确编辑问题。如果我从字面上看你的例子,那么在创建df 之后我得到了错误replacement has 12 rows, data has 5114

标签: r plot ggplot2 time-series boxplot


【解决方案1】:

我不熟悉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()

【讨论】:

    【解决方案2】:

    刚刚发现了一种更简单的方法,不管你的回答对爵士乐有什么帮助

        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))
    

    【讨论】:

    • 请不要在代码中间添加install.packages 命令。
    猜你喜欢
    • 2020-12-08
    • 1970-01-01
    • 2020-12-31
    • 2016-09-16
    • 2020-10-07
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 2016-11-30
    相关资源
    最近更新 更多