Используя воспроизводимый пример
set.seed(1)
x <- as.POSIXct(sort(sample(100000, 100)), origin="1960-01-01")
y <- rpois(100, 5)
plot(x, y, type = "l", xlab = "Time")
, мы можем использовать функцию axis.POSIXct()
(можно также использовать универсальный Axis()
S3) для добавления пользовательской оси к графику.Суть в том, что вы, пользователь, полностью контролируете, где рисуются тики и как они помечены, вам просто нужно работать немного усерднее, если значения по умолчанию не работают для вас.
Сначала мы наносим данные на график, но подавляем отрисовку оси x:
plot(x, y, type = "l", xlab = "Time", xaxt = "n")
Далее я добавляю большую галочку в начале каждого часа.Для этого я создаю последовательность datetime, которая идет от
- от округленного часа первого наблюдения в серии,
- до конец последнего часа, в который было сделано наблюдение (используя
ceiling()
для перехода к следующему часу), - с увеличением последовательности за 1 час (
by = "1 hour"
)ед.
Эта последовательность передается аргументу at
axis.POSIXct()
.За остальными должно быть легко следить, если не читать ?axis.POSIXct
и ?par
## add axis tick at each hour:
axis.POSIXct(side = 1, x = x,
at = seq(from = round(x[1], "hours"),
to = x[1] + ceiling(difftime(tail(x, 1), head(x, 1),
units = "hours")),
by = "1 hour"),
las = 2)
Получившийся рисунок выглядит следующим образом:
ПоказатьДля более точного управления я теперь добавляю незначительные отметки в каждом получасовом местоположении, но подавляю аннотацию этих отметок (с помощью аргумента labels
), а также делаю меньшие отметки (с помощью графического параметра tcl
).Обратите внимание, как аргумент by
метода seq()
может принимать числовую величину указанного интервала
## add minor ticks at 30 min intervals to above plot
axis.POSIXct(side = 1, x = x,
at = seq(from = round(x[1], "hours"),
to = x[1] + ceiling(difftime(tail(x, 1), head(x, 1),
units = "hours")),
by = "30 mins"),
las = 2, tcl = -0.2, labels = FALSE)
Теперь график выглядит так:
Вы можете добавлять свои собственные метки, а не те, которые предлагает функция axis.POSIXct
.Если вы хотите сделать это, то мы должны присвоить вывод из seq()
объекту, который мы затем можем использовать с помощью функции format()
.Например:
plot(x, y, type = "l", xlab = "Time", xaxt = "n")
tseq <- seq(from = round(x[1], "hours"),
to = x[1] + ceiling(difftime(tail(x, 1), head(x, 1),
units = "hours")),
by = "1 hour")
axis.POSIXct(side = 1, x = x, at = tseq,
labels = format(tseq, format = "%H:%M"), las = 2)
Полученный график показан ниже:
format()
возвращает строку символов отформатированной даты-времени.Вы можете paste()
на любом другом месте или посмотреть на другие заполнители, которые можно использовать для форматирования объектов даты и времени в ?strftime