簡體   English   中英

用於繪制時間序列數據的x軸刻度的日期格式

[英]Date format for plotting x axis ticks of time series data

數據文件的日期格式為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]))給出了數據不良的錯誤行。

請提供有關如何使用日期信息讀取此數據的解決方案。

數據文件的一小部分

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給出了尺寸誤差,並且繪圖命令沒有顯示超過一年的數據或其他數據的月度標簽。 任何定制刻度軸的方法?

也許你不使用as.yearmon()正確的,因為對我來說,下面的工作(使用dat由加文的答案):

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. 使用“zoo”包中的as.yearmon()轉換為xts

     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. 繪制數據,但用xaxt = "n"抑制x軸

     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()的使用。

使用您的數據:

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()有效輸入。 這個位可以通過在date每個元素后附加"-01"來完成。 我們需要添加"-"分隔符,以便明確區分我們添加的新日期。

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"和日期部分"-"之前的分隔符。

將這與transform()完全一起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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM