gpt4 book ai didi

r - 用于绘制时间序列数据的 x 轴刻度的日期格式

转载 作者:行者123 更新时间:2023-12-04 09:36:30 25 4
gpt4 key购买 nike

数据文件的日期是时间序列数据的格式,即 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")也不读取日期并给出错误......所有不适用。

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()正确,因为以下对我有用(使用来自 Gavin 的回答 dat):

library(zoo)
dat$date <- as.yearmon(dat$date, "%YM%m")

因此,努力让事情正确地绘制:
  • 您的数据:
    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)
  • 转换为 xts使用 as.yearmon()来自“动物园”包。
    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
  • 绘制您的数据:
    plot.zoo(dat.xts)

    enter image description here
    plot.zoo(dat.xts, 
    plot.type="single",
    col = c("red", "blue"))

    enter image description here

  • 更新:指定您自己的轴

    这是一些可以使用的示例数据(在询问 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) 获得的默认图:

    enter image description here

    从您的评论来看,您似乎想要每月标签之类的东西。
  • 绘制数据,但使用 xaxt = "n" 抑制 x 轴
    plot(dat.z, screen = 1, col = 1:2, xaxt = "n")
  • 做一些设置工作,每个月都有一个标签。 (见 ?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
  • 将您的轴添加到您的绘图中。可能需要进行一些实验来为所有东西找到合适的尺寸。 las = 2使标签垂直于轴,如果您真的觉得需要为每年的每个月包含一个标签,则这是必需的。
    axis(side = 1, at = tt[ix], labels = labs[ix], 
    tcl = -0.7, cex.axis = 0.7, las = 2)

  • 这是最终的情节:

    enter image description here

    顺便说一句,如果您收到类似 1977.15 的日期等等,你可能想通读一些答案 to this question ,例如,查看@joran 对 pretty() 的使用.

    关于r - 用于绘制时间序列数据的 x 轴刻度的日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13067012/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com