7

数据文件的日期是时间序列数据的格式,即 1975M1、1975M2、... 2011M12。使用 R 绘制此数据时,我希望 x 轴在刻度轴上显示月份。

为了正确读取日期,我尝试将 M 替换为 - 以获取 %Y-%m 格式,但这对于 hydroTSM 包中的 drawTimeAxis 似乎并不好,它可能需要 %Y-%M-%d 格式。它给出了错误,即刻度维度的维度数不正确。

另一种解析和格式化数据的方法,x$newdate <- strptime(as.character(x$date), "%Y-%m")然后format(x$newdate,""%Y-%m") 也不读取日期并给出错误......所有NA。

date <- as.Date(data[,1] 字符串不是标准明确格式和 ts <- read.zoo(xts, as.yearmon(x[,1])) 的错误在数据上给出了错误的 enries行。

请给出如何使用日期信息读取此数据的解决方案。

数据文件的一小部分

date    x   x2
1975M1  112.44  113.12
1975M2  113.1   114.36
1975M3  115.04  114.81
1975M4  117.65  115.35
1975M5  119.5   116.92
1975M6  121.4   118.56
1975M7  120.64  118.97
1975M8  119.12  119.84
1975M9  118.91  120.59
1975M10 120.58  122.3
1975M11 121.26  123.35
1975M12 122.34  123.33

更新:到目前为止的答案通过在 xts 包中使用 %YM%m 或添加获取标准格式的日期来解决正确读取日期的问题。刻度轴的自定义仍然是一个问题。drawTimeAxis 给出尺寸错误,并且绘图命令未显示超过一年数据的每月标签或其他数据。自定义刻度轴的任何方法?

4

2 回答 2

18

也许您没有as.yearmon()正确使用,因为以下内容对我有用(使用dat来自 Gavin 的回答):

library(zoo)
dat$date <- as.yearmon(dat$date, "%YM%m")

因此,努力让事情正确绘制:

  1. 您的数据:

    dat <- read.table(text = "date    x   x2
    1975M1  112.44  113.12
    1975M2  113.1   114.36
    1975M3  115.04  114.81
    1975M4  117.65  115.35
    1975M5  119.5   116.92
    1975M6  121.4   118.56
    1975M7  120.64  118.97
    1975M8  119.12  119.84
    1975M9  118.91  120.59
    1975M10 120.58  122.3
    1975M11 121.26  123.35
    1975M12 122.34  123.33", header = TRUE)
    
  2. 从“动物园”包转换为xts使用。as.yearmon()

    library(xts) # Will also load zoo
    dat.xts <- xts(dat[-1], 
                   order.by = as.yearmon(dat$date, "%YM%m"))
    dat.xts
    #               x     x2
    # Jan 1975 112.44 113.12
    # Feb 1975 113.10 114.36
    # Mar 1975 115.04 114.81
    # Apr 1975 117.65 115.35
    # May 1975 119.50 116.92
    # Jun 1975 121.40 118.56
    # Jul 1975 120.64 118.97
    # Aug 1975 119.12 119.84
    # Sep 1975 118.91 120.59
    # Oct 1975 120.58 122.30
    # Nov 1975 121.26 123.35
    # Dec 1975 122.34 123.33
    
  3. 绘制数据:

    plot.zoo(dat.xts)
    

    在此处输入图像描述

    plot.zoo(dat.xts, 
             plot.type="single", 
             col = c("red", "blue"))
    

    在此处输入图像描述

更新:指定自己的轴

这是一些可以使用的示例数据(在 SO 上提问时分享这些示例数据通常很好,因为它可以让其他人更容易复制和解决您的问题)。请注意,对于此示例,我们已跳过使用“xts”包,因为它并不是真正必要的。

set.seed(1)
dat <- data.frame(date = paste0(rep(1975:1977, each = 12), 
                                "M", rep(1:12, times = 3)),
                  x1 = runif(36, min = 100, max = 140),
                  x2 = runif(36, min = 100, max = 140))
library(zoo) # xts is actually unnecessary if this is all you're doing
# Convert your data to a `zoo` object
dat.z <- zoo(dat[-1], order.by = as.yearmon(dat$date, "%YM%m"))

这是使用 获得的默认图plot(dat.z, screen = 1, col = 1:2)

在此处输入图像描述

根据您的评论,听起来您想要每月标签之类的东西。

  1. 绘制数据,但抑制 x 轴xaxt = "n"

    plot(dat.z, screen = 1, col = 1:2, xaxt = "n")
    
  2. 做一些设置工作,每个月都有一个标签。(请参阅?plot.zoo,从哪里修改。)

    tt <- time(dat.z)
    # The following is just the sequence 1:36. 
    #   If you wanted only every third month plotted,
    #   use a sequence like ix <- seq(1, length(tt), 3)
    ix <- seq_along(tt) 
    # What format do you want for your labels.
    #   This yields abbreviated month - abbreviated year
    fmt <- "%b-%y" 
    labs <- format(tt, fmt) # Generate the vector of your labels
    
  3. 将您的轴添加到您的情节中。可能需要进行一些实验才能找到适合所有物品的尺寸。las = 2使标签垂直于轴,如果您确实需要为每年的每个月添加标签,则需要这样做。

    axis(side = 1, at = tt[ix], labels = labs[ix], 
         tcl = -0.7, cex.axis = 0.7, las = 2)
    

这是最后的情节:

在此处输入图像描述

顺便说一句,如果您收到诸如此类的日期1977.15,您可能需要通读此问题的一些答案,例如,查看@joran 对pretty().

于 2012-10-25T11:33:42.913 回答
2

使用您的数据:

dat <- read.table(text = "date    x   x2
1975M1  112.44  113.12
1975M2  113.1   114.36
1975M3  115.04  114.81
1975M4  117.65  115.35
1975M5  119.5   116.92
1975M6  121.4   118.56
1975M7  120.64  118.97
1975M8  119.12  119.84
1975M9  118.91  120.59
1975M10 120.58  122.3
1975M11 121.26  123.35
1975M12 122.34  123.33", header = TRUE)

您缺少的是您需要在日期中添加一天,以便它们成为as.Date(). 该位可以通过附加"-01"到 的每个元素来完成date。我们需要添加"-"分隔符以清楚地划分月份与我们添加的新日期。

paste0(as.character(date), "-01") ## temporary step, not needed

现在我们有了类似的东西

> with(dat, paste0(date, "-01"))  ## temporary step, not needed
 [1] "1975M1-01"  "1975M2-01"  "1975M3-01"  "1975M4-01"  "1975M5-01" 
 [6] "1975M6-01"  "1975M7-01"  "1975M8-01"  "1975M9-01"  "1975M10-01"
[11] "1975M11-01" "1975M12-01"

我们可以写出一个合适的格式,as.Date()可以使用:"%YM%m-%d". 请注意,我们"M"在 day part 之前包含文字和分隔符"-"

将其与transform()将结果重新插入dat我们有:

## full solution
dat <- transform(dat, date = as.Date(paste0(date, "-01"), format = "%YM%m-%d"))

这使

> dat
         date      x     x2
1  1975-01-01 112.44 113.12
2  1975-02-01 113.10 114.36
3  1975-03-01 115.04 114.81
4  1975-04-01 117.65 115.35
5  1975-05-01 119.50 116.92
6  1975-06-01 121.40 118.56
7  1975-07-01 120.64 118.97
8  1975-08-01 119.12 119.84
9  1975-09-01 118.91 120.59
10 1975-10-01 120.58 122.30
11 1975-11-01 121.26 123.35
12 1975-12-01 122.34 123.33
于 2012-10-25T11:12:29.037 回答