【问题标题】:R: Finding the location of tick marks when plotting datesR:绘制日期时查找刻度线的位置
【发布时间】:2013-08-13 06:03:16
【问题描述】:

我正在运行一个 R 脚本,该脚本使用 plot 绘制随时间变化的数据,并使用 as.Date 获取一些数据。然后我使用grid 添加这样的指南:

plot(as.Date(data[["Date"]]), -data[["dbns"]], lwd=1, col = colours[i], type="l",ylim=ylimit, xlim=xlimit, xlab="", ylab =ylabel)

grid(NULL,NULL,lwd=1)

下面是这个结果的示例(实际上示例是在此图循环 3 次以添加每一行之后)

我遇到的问题是grid 添加的指南与plot 添加的默认刻度线不一致。默认情况下,绘图功能每 10 年添加一次刻度,这就是我想要的。查看axTicks(1) 给我0 5000 10000 15000,这是1970 年1 月1 日之后以天为单位的指南位置。

有没有办法找出已添加的刻度线的位置?更重要的是,有没有办法设置指南以匹配这些位置?

我意识到对于这个例子,刻度是[0, 365.25*10, 365.25*20 etc.],但解决一般情况的答案会很好。

谢谢

日本

编辑:

这是一个可重现的示例,可以准确地说明我的意思。

data <- read.csv("test.csv"), header =TRUE)
data[["Date"]] <- as.Date(data[["Date"]], format = "%d/%m/%Y")

data<-data[order(as.Date(data$Date)),]


plot(as.Date(data[["Date"]]), -data[["dbns"]], type="l", xlim=xlimit)
grid(NULL,NULL,lwd=3)

文件 test.csv 如下所示(提取实际数据)

bore    Date    dbns
42230210A   20/01/2009  13.13
42230210A   8/05/2009   13.21
42230210A   18/06/2009  13.19
42230210A   3/08/2009   13.2
42230210A   2/09/2009   13.25
42230210A   1/10/2009   13.3
42230210A   3/12/2009   13.32
42230210A   24/02/2010  13.3
42230210A   18/05/2010  13.3
42230210A   25/04/2012  11.45
42230210A   27/09/1966  11.18
42230210A   28/10/1969  11.14
42230210A   6/01/1970   11.03
42230210A   5/06/1973   10.68
42230210A   28/08/1973  10.63
42230210A   2/10/1973   10.73
42230210A   4/12/1973   10.7
42230210A   20/02/1980  11.39
42230210A   29/04/1980  11.45
42230210A   27/08/1980  11.45
42230210A   22/06/1988  11.14
42230210A   27/02/1996  11.78
42230210A   6/08/1996   11.68
42230210A   8/02/2000   11.64
42230210A   8/06/2000   11.71
42230210A   7/09/2000   11.75
42230210A   15/07/2008  13.01

其输出如下。指南偏离了刻度线?

【问题讨论】:

  • 非常感谢reproducible example
  • 嗨 Ben,添加了一些示例代码和一些数据。希望这更清楚一点

标签: r datetime plot


【解决方案1】:

所以检查?grid 表明它正在根据“默认”刻度线位置放置网格线,但是由于您绘制了一个日期对象,R 没有使用“默认”(在将日期视为数字变量的感觉)来放置刻度线。

文档进一步指出,如果你需要更精细的控制,你应该使用abline直接放置它们。

所以你可能想要这样做:

plot(as.Date(data[["Date"]]), -data[["dbns"]], type="l")
grid(NA,NULL,lwd=3)
v <- as.numeric(as.Date(paste0(c(1970,1980,1990,2000,2010),'-01-01')))
abline(v = v,lty = "dotted",col = "lightgray",lwd = 3)

【讨论】:

  • abline(v=pretty(data$Date),lty=3,col="lightgray") 可以让它自动化一点。
  • 感谢 joran,这绝对解决了我的第一个问题。我遇到的第二个问题是,这只是使用此脚本生成的大约 50 个图表之一。并非所有的刻度都有 10 年的间隔,也不是所有的都有相同的时间跨度。所以我一直在寻找一种方法来提取蜱的位置,然后放入 abline
  • 宾果游戏!非常感谢
  • @joran -- 我很高兴将我的答案合并到您的答案中(使用Axis 创建Date 轴并保存刻度线位置。
  • @mnel 去吧,如果你愿意的话。
【解决方案2】:

有一个函数Axis.DateDate 对象的轴创建适当漂亮的轴刻度位置。这不会更改 grid 用于查找刻度线位置的 par('xaxp')

我们可以通过手动创建轴(并保存值)来解决

# assuming your data is called DD
DD$Date <- as.Date(as.character(DD$Date), format = '%d/%m/%Y')
# don't plot the x axis (xaxt = 'n')
plot(-dbns~Date,data = DD[order(DD$Date),], type="l", xaxt = 'n')
# create the axis and  save the tick locations
at <- as.numeric(Axis(side = 1, x = DD$Date))
grid(NA,NULL,lwd=3)
abline(v = at,lty = "dotted",col = "lightgray",lwd = 3)

【讨论】:

  • 谢谢 mnel,这对我也有用,但我不得不删除第一行。您能解释一下为什么使用“as.character”而不是“as.Date”吗?
  • @jprockbelly -- 当我读入数据时,R 将 Date 强制转换为一个因素 -- 所以我强制转换为字符,所以 as.Date 可以工作。 (as.Date 也在那里)
【解决方案3】:

您的问题的答案如下:

有没有办法找出已添加的刻度线的位置?

plot函数调用之后,使用函数axis.Date

x_ticks <- axis.Date(1, data$Date, labels = FALSE)

变量x_ticks 包含在x 轴上使用的刻度的位置(在函数的第一个参数中由1 标识)。

更重要的是,有没有办法设置指南以匹配这些位置?

grid(NA, NULL, lwd=3)
x_ticks <- axis.Date(1, data$Date, labels = FALSE)
abline(v = x_ticks, lty = 3, col ="lightgray", lwd = 3)

grid 函数(nx = NA) 的第一个参数中使用NA,可以避免将垂直线打印在错误的位置。第二个给你蜱的位置。最后,第三个在正确的位置打印指南。

这样,你得到的情节看起来就像你所期望的那样

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多