R如何标记非连续的x轴刻度

时间:2014-03-02 00:18:43

标签: r plot time-series axis-labels

我正在跟进@Gavin Simpson对早期关于x轴刻度标记的问题的回答,并提出了一个关于非顺序刻度标签的问题。以下是他设置问题的响应示例:

set.seed(53)
f <- rnorm(700, 2)
dates <- seq(as.Date("04/01/2012", format = "%d/%m/%Y"),
             by = "days", length = length(f))
head(f)
op <- par(mar = c(7,4,4,2) + 0.1) ## more space for the labels
plot(dates, f, xaxt = "n", ann = FALSE)
labDates <- seq(as.Date("01/01/2012", format = "%d/%m/%Y"), tail(dates, 1),
                by = "months")
axis.Date(side = 1, dates, at = labDates, format = "%b %y", las = 2)
title(ylab = "f") ## draw the axis labels
title(xlab = "dates", line = 5) ## push this one down a bit in larger margin
par(op) ## reset margin

然而,不是从“1月12日”开始到12月13日结束的x轴刻度标签的顺序集合,我想仅标记几个非连续且长度不同于f的日期,例如截至2012年3月3日,2012年4月27日,2012年10月20日和2013年5月8日,剩余的情节仍然存在。所以我设置了一个日期的向量来调用,但之后会被绊倒:

set.seed(53)
f <- rnorm(700, 2)   # the count doesn't matter
MyDates<-c("03/03/12", "04/27/13","10/20/12", "05/08/13")   # non-sequential char string of dates not equal to f
plot(MyDates, f, xaxt = "n", ann = FALSE)
axis.Date(1, MyDates, at=c(1,length(MyDates), ??????))   #not complete and not right

所以我的问题是如何标记一组长度与数据不同的非连续x轴刻度线?

我还想在我选择的日期添加垂直线,我知道可以使用abline()添加,但是由于我正在解决这个axis.Date问题,所以还没有到达那里

1 个答案:

答案 0 :(得分:0)

首先,将您选择的日期从character转换为Date(使用正确的格式字符串):

MyDates <- as.Date(MyDates, format = "%m/%d/%y")
# [1] "2012-03-03" "2013-04-27" "2012-10-20" "2013-05-08"

class(MyDates)
# [1] "Date"

然后,您只能在这些点添加带刻度的轴:

axis.Date(side = 1, at = MyDates, format = "%b %y", las = 2)

那个短轴看起来很难看?添加第一个和最后一个日期:

axis.Date(side = 1, at = c(min(dates), MyDates, max(dates)), format = "%b %y", las = 2)

想要拉伸轴但没有第一个/最后一个标签?不要打印它们:

axis.Date(side = 1, at = c(min(dates), MyDates, max(dates)), 
    labels = c("", format(MyDates, "%b %y"), ""), las = 2)

或者,首先绘制一个没有标签的长轴:

axis.Date(side = 1, at = c(min(dates), max(dates)), labels=FALSE)
axis.Date(side = 1, at = MyDates, format = "%b %y", las = 2)

垂直线:

abline(v=MyDates)
abline(v=MyDates, lty="dashed", col="red")
# etc.