【问题标题】:R how to label non-sequential x-axis ticksR如何标记非连续的x轴刻度
【发布时间】:2014-03-02 00:18:43
【问题描述】:

我正在跟进@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 问题,所以还没有到达那里。

【问题讨论】:

  • 响应标题,las = 1 会让y轴标签水平。
  • 标题已被编辑。谢谢。

标签: r plot time-series axis-labels


【解决方案1】:

首先,将您选择的日期从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.

【讨论】:

  • 我很欣赏这些选项,但您能否帮我解决plot(MyDates, f, xaxt = "n", ann = FALSE)fMyDates 长度不等的问题?
  • 嗯?在您的问题中,您正确绘制了相等长度的向量(datesf),并询问如何在较短的 x 向量 MyDates 上放置刻度线,我回答了。你现在想在评论中做什么?
  • 好吧,当我把代码放在一起时,set.seed(53); f &lt;- rnorm(700, 2); MyDates&lt;-c("03/03/12", "04/27/13","10/20/12", "05/08/13"); MyDates &lt;- as.Date(MyDates, format = "%m/%d/%y"); class(MyDates); plot(MyDates,f, xaxt = "n", ann = FALSE); ,我得到一个错误,'x'(MyDates)和'y'(f)长度不同。你没有?
  • 你不需要像plot(MyDates,f, xaxt = "n", ann = FALSE); 这样的东西。摆脱那条线。
  • 当我将您的建议应用于这组数据时,它可以工作,但在我的真实数据和脚本上它不起作用。我仍在寻找错误。我的真实数据集是通过数据库连接调用的,在此特定操作之前我对其进行了相当多的操作,因此发布真实数据集对我来说是不可能的;因此我使用了上面的虚拟集合,它似乎太简单了。简而言之,我的 'x' 是来自数据表 (Rdataset$Epoch) 的 Epoch,而我的 'y' 是相同长度的距离 (Rdataset$Distance)。我可以毫无问题地绘制它,但是当我尝试用(续)替换 Epochs 时......
猜你喜欢
  • 1970-01-01
  • 2019-09-23
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
相关资源
最近更新 更多