график временных рядов с осью x в "году" - "месяц" в R

У меня есть "ежемесячные данные". Я хочу построить данные таким образом, чтобы получить дату в формате %Y-%m" (2001-01) по оси x. Скажем, мои данные pcp <- rnorm(24).

Я пытался:

PCP <- ts(pcp, frequency = 12, start = 2001)
plot(PCP) 

но график имеет только годы на оси х.

Как получить сюжет с форматом даты, который я желаю по оси x?

Ответ 1

Я считаю, что отличный пакет xts - лучший способ хранения ваших данных. Если у вас его нет, вы можете скачать его с помощью install.packages('xts').

Давайте начнем с основ - включая создание pcp, так как вы не предоставили его.

require(xts)
pcp <- rnorm(24)
PCP <- ts(pcp, frequency = 12, start = 2001)
plot(as.xts(PCP), major.format = "%Y-%m")

Это дает вам диаграмму, похожую на следующее. Вы можете настроить даты, изменив строку, переданную в major.format. Например, "%b-%y" дает даты в формате Jan-01 за январь 2001 года.

example plot

Ответ 2

Здесь идея с игрушечными данными, так как вопрос не воспроизводится. Надеюсь, это поможет

R> foo = ts(rnorm(36), frequency = 12, start = 2001)
R> plot(foo, xaxt = "n")
R> tsp = attributes(foo)$tsp
R> dates = seq(as.Date("2001-01-01"), by = "month", along = foo)
R> axis(1, at = seq(tsp[1], tsp[2], along = foo), labels = format(dates, "%Y-%m"))

Output

ggplot с данными, которые выглядят как ваши

R> df = data.frame(date = seq(as.POSIXct("2001-01-01"), by = "month", length.out = 36), pcp = rnorm(36))
R> library(ggplot2)
R> library(scales)
R> p = ggplot(data = df, aes(x = date, y = pcp)) + geom_line()
R> p + scale_x_datetime(labels = date_format("%Y-%m"), breaks = date_breaks("months")) + theme(axis.text.x = element_text(angle = 45))

enter image description here

Ответ 3

Лучший способ - использовать axis.POSIXct {graphics} Вот пример с помощью этой функции:

with(beaver1, {
time <- strptime(paste(1990, day, time %/% 100, time %% 100),
                 "%Y %j %H %M")
plot(time, temp, type = "l") # axis at 4-hour intervals.
# now label every hour on the time axis
plot(time, temp, type = "l", xaxt = "n")
r <- as.POSIXct(round(range(time), "hours"))
axis.POSIXct(1, at = seq(r[1], r[2], by = "hour"), format = "%H")
})

в вашем случае измените формат в format="%Y-%m"

С Уважением,