首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >绘制时间序列数据的x轴刻度的日期格式

绘制时间序列数据的x轴刻度的日期格式
EN

Stack Overflow用户
提问于 2012-10-25 18:53:15
回答 2查看 18.5K关注 0票数 7

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

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

另一种解析和格式化数据的方法,就像在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)在数据行给出了错误的拼写。

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

数据文件的一小部分

代码语言:javascript
运行
复制
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给出了尺寸错误,并且plot命令不会显示超过一年的数据或其他数据的月度标签。有什么方法可以自定义刻度轴吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-25 19:33:43

也许您没有正确使用as.yearmon(),因为以下方法对我有效(使用加文答案中的dat ):

代码语言:javascript
运行
复制
library(zoo)
dat$date <- as.yearmon(dat$date, "%YM%m")

因此,通过工作让事情正确地绘制出来:

  1. 你的数据:

dat <- read.table(文本= "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)

  • Conversion to xts using as.yearmon() from "zoo“package。

library(xts) #还将加载动物园日期<- xts(dat-1,order.by =as.yearmon(dat$ dat.xts,"%YM%m")) dat.xts #x x2 #1975年1月112.44 113.12 #2月1975 113.10 114.36 #1975年3月115.04 114.81 #4月1975 117.65 115.35 #1975年5月119.50 116.92 #1975年6月121.40 118.56 #1975年7月120.64 118.97 #1975年8月119.12 119.84 #1975年9月118.91 120.59 #1975年10月120.58 122.30 #1975年11月121.26123.35 #1975年12月122.34 123.33

  • Plotting你的数据:

plot.zoo(dat.xts)

plot.zoo(dat.xts,plot.type=“单色”,plot.type==c(“红色”,“蓝色”))

更新:指定您自己的轴

下面是一些可使用的示例数据(在提问时共享这些示例数据通常很好,因为这会使其他人更容易复制和解决您的问题)。请注意,对于这个示例,我们跳过了使用"xts“包,因为它实际上并不是必需的。

代码语言:javascript
运行
复制
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”)

  • 执行一些设置工作,以便每个月都有一个标签。(请参见?plot.zoo,在其中对其进行修改。)

tt <- time(dat.z) #以下是序列1:36。#如果您只想每隔三个月绘制一次,#请使用类似于ix <- seq(1,length(tt),3) ix <- seq_along(tt) #的序列。#这将生成缩写月份-缩写年份fmt <- "%b-%y“实验室<- format(tt,fmt) #生成标签的矢量

  • 将轴添加到绘图中。可能需要一些实验来找到适合所有东西的大小。las = 2使标签垂直于轴,如果您确实觉得需要在每年的每个月都包含一个标签,则需要这样做。

轴(side= 1,at = ttix,labels = labsix,tcl = -0.7,cex.axis = 0.7,las = 2)

这是最终的图:

顺便说一句,如果你得到了像1977.15之类的日期,你可能想通读一些答案to this question,例如,看看@joran对pretty()的使用。

票数 18
EN

Stack Overflow用户

发布于 2012-10-25 19:12:29

使用您的数据:

代码语言:javascript
运行
复制
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的每个元素来完成。我们需要添加"-"分隔符,以清楚地将月份与我们添加的新日期区分开来。

代码语言:javascript
运行
复制
paste0(as.character(date), "-01") ## temporary step, not needed

现在我们有了类似于

代码语言:javascript
运行
复制
> 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()将结果重新插入到dat中,我们得到了:

代码语言:javascript
运行
复制
## full solution
dat <- transform(dat, date = as.Date(paste0(date, "-01"), format = "%YM%m-%d"))

这给了我们

代码语言:javascript
运行
复制
> 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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13067012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档