Как заменить числа по оси X по датам при использовании графика в R?

Я хотел бы представить x lab в качестве даты, а не числа. если вы, например, заговорили:

 f=c(2,1,5,4,8,9,5,2,1,4,7)
 plot(f)

вы попадаете в диапазон чисел оси x в зависимости от того, сколько у нас значений. Как я могу установить, например, мое первое значение как 04/01/2012, а второе значение - 05/01/2012 и т.д., А затем представить их по оси x в качестве даты не числа!

У меня нет даты в моих данных, но я знаю первую дату.

Заранее спасибо

Ответ 1

Вы можете либо пометить ось самостоятельно, либо получить R, чтобы сделать это для вас, создав вектор дат для ваших наблюдений, используя класс "Date". Вот пример:

f <- c(2,1,5,4,8,9,5,2,1,4,7)
dates <- seq(as.Date("04/01/2012", format = "%d/%m/%Y"),
             by = "days", length = length(f))

plot(dates, f)

dates заканчивается:

> dates
 [1] "2012-01-04" "2012-01-05" "2012-01-06" "2012-01-07" "2012-01-08"
 [6] "2012-01-09" "2012-01-10" "2012-01-11" "2012-01-12" "2012-01-13"
[11] "2012-01-14"

и график выглядит следующим образом:

enter image description here

Если вам нужно больше управления и что метки точно так же, как у вас есть, вам нужно подавить рисование оси x, а затем добавить его вручную, используя axis.Date, например.

plot(dates, f, xaxt = "n")
axis.Date(side = 1, dates, format = "%d/%m/%Y")

который производит

enter image description here

Вы также можете повернуть эти метки оси, например, используя las = 2.

Подробнее см. ?axis.Date, ?strftime и ?as.Date.

Более тонкое управление размещением меток с помощью axis.Date

Чтобы переопределить эвристику по умолчанию для размещения меток, укажите местоположения для тиков, используя аргумент at. Например, с более длинной последовательностью в 700 дней мы можем помещать метки в начале каждого месяца:

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

Это приводит к:

enter image description here

Вы можете изменить эту тему, например. этикетка раз в два месяца, незначительный тик для других месяцев

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 = "2 months")
## new dates for minor ticks
minor <- seq(as.Date("01/02/2012", format = "%d/%m/%Y"), tail(dates, 1),
             by = "2 months")
axis.Date(side = 1, dates, at = labDates, format = "%b %y", las = 2)
## add minor ticks with no labels, shorter tick length
axis.Date(side = 1, dates, at = minor, labels = FALSE, tcl = -0.25)
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

что приводит к

enter image description here

Дело в том, что если вам не нравятся значения по умолчанию, у вас есть полный контроль над тем, где обозначена ось, просто создав вектор дат для местоположений меток/тиков, которые вы хотите.