【问题标题】:What is the most elegant way to split data and produce seasonal boxplots?分割数据和生成季节性箱线图的最优雅方法是什么?
【发布时间】:2012-08-21 09:51:22
【问题描述】:

我想为许多不同的时间序列制作季节性箱线图。我希望下面的代码清楚地说明了我想要做什么。

我现在的问题是,如何用尽可能少的代码行以最优雅的方式做到这一点。我可以使用函数“子集”为每个月创建一个新对象,然后绘制它,但这似乎不是很优雅。我尝试使用“拆分”功能,但我不知道如何从那里开始。

如果我的问题没有明确说明,请告诉我或编辑它以使其更清楚。

非常感谢任何直接帮助或与其他网站/帖子的链接。感谢您的宝贵时间。

代码如下:

## Create Data
Time <- seq(as.Date("2003/8/6"), as.Date("2011/8/5"), by = "2 weeks")
data <- rnorm(209, mean = 15, sd = 1)
DF <- data.frame(Time = Time, Data = data)
DF[,3] <- as.numeric(format(DF$Time, "%m"))
colnames(DF)[3] <- "Month"

## Create subsets
Jan <- subset(DF, Month == 1)
Feb <- subset(DF, Month == 2)
Mar <- subset(DF, Month == 3)
Apr <- subset(DF, Month == 4)

## Create boxplot
months <- c("Jan", "Feb", "Mar", "Apr")
boxplot(Jan$Data, Feb$Data, Mar$Data, Apr$Data, ylab = "Data", xlab = "Months", names = months)

## Try with "split" function
DF.split <- split(DF, DF$Month)
head(DF.split)

【问题讨论】:

  • 感谢 ROLO 和 James 的快速响应和出色的解决方案。
  • 代码在 Win 7 和 R 2.14.1 下不起作用。一些月度值(“%b”)得到了 NA,因此在绘图期间被省略。任何想法为什么会发生,@James?我之前在 Windows 下也遇到过类似的时间函数问题。不过,代码在 Mac OS X 下运行良好!
  • %b 的行为取决于当前的语言环境,本质上是试图匹配当地语言的月份缩写;反过来,语言环境的行为往往非常依赖于平台,我怀疑即使是相同的名义语言环境在不同的平台上也会有不同的行为(或者您可能在不同的机器上设置了不同的语言环境)。它不会那么优雅,但您可以使用month.abb(硬编码的英文月份缩写)而不是strftime(...) 创建一个解决方案
  • 现在,它又可以在 Windows 机器上运行了。我将 Sys.setlocale 更改为 Sys.setlocale("LC_TIME", "English") 并且效果很好。感谢@Ben Bolker。

标签: r date split boxplot


【解决方案1】:

使用“ggplot2”(以及@James 的月份名称,谢谢!):

DF$month <- factor(strftime(DF$Time,"%b"),levels=month.abb)
ggplot(DF, aes(x=,month, y=Data)) +
    geom_boxplot()

(顺便说一句:请注意,在“ggplot2”中“上下“铰链”对应于第一个和第三个四分位数(第 25 个和第 7 个百分位数)。这与 boxplot 函数使用的方法略有不同,并且在小样本中可能很明显。" - 见documentation)

【讨论】:

    【解决方案2】:

    您最好直接使用"%b" 格式并使用有序因子和boxplot 的公式接口来选择月份名称:

    DF$month <- factor(strftime(DF$Time,"%b"),levels=month.abb)
    boxplot(Data~month,DF)
    

    【讨论】:

      【解决方案3】:

      要将月份设置为在任何区域设置中,请使用可在?month.abb 的帮助页面中找到的技巧:

      Sys.setlocale("LC_TIME", "German_Germany")
      DF$month <- factor(format(DF$Time, "%b"), levels=format(ISOdate(2000, 1:12, 1), "%b"))
      

      您也可以在lattice 中绘制它:

      require(lattice)
      bwplot(Data~month, DF, pch="|") # set pch to nice line instead of point
      

      【讨论】:

        猜你喜欢
        • 2013-09-29
        • 2010-11-05
        • 1970-01-01
        • 2019-07-16
        • 1970-01-01
        • 1970-01-01
        • 2019-11-22
        • 2020-09-16
        • 1970-01-01
        相关资源
        最近更新 更多