简体   繁体   中英

How to change x-axis label intervals for a datetime series in R

I have created a plot with a time series on the x-axis and count values on the y-axis. I would like to know how to change the intervals on the time series x-axis so that the time interval is every 3 hours. I am not sure how to apply a simple method like at=seq(0,100,10) to a time series. Secondly, is it possible to use text labels for times that are not represented in your dataset? ie the example data below are in 10-minute intervals starting at 09:29, but would it be possible to use time values on the x-axis that fall on the hour? I am assuming that the only way to do this would be to manually list the times in a text string but wondered whether I am missing anything? Any advise would be appreciated.

Example data:

> dput(df)
structure(list(datetime = structure(c(1396603740, 1396604340, 
1396604940, 1396605540, 1396606140, 1396606740, 1396607340, 1396607940, 
1396608540, 1396609140, 1396609740, 1396610340, 1396610940, 1396611540, 
1396612140, 1396612740, 1396613340, 1396613940, 1396614540, 1396615140, 
1396615740, 1396616340, 1396616940, 1396617540, 1396618140, 1396618740, 
1396619340, 1396619940, 1396620540, 1396621140, 1396621740, 1396622340, 
1396622940, 1396623540, 1396624140, 1396624740, 1396625340, 1396625940, 
1396626540, 1396627140, 1396627740, 1396628340, 1396628940, 1396629540, 
1396630140, 1396630740, 1396631340, 1396631940, 1396632540, 1396633140, 
1396633740, 1396634340, 1396634940, 1396635540, 1396636140, 1396636740, 
1396637340, 1396637940, 1396638540, 1396639140, 1396639740, 1396640340, 
1396640940, 1396641540, 1396642140, 1396642740, 1396643340, 1396643940, 
1396644540, 1396645140, 1396645740, 1396646340, 1396646940, 1396647540
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), count = c(46, 
45, 47, 43, 49, 46, 46, 44, 44, 44, 45, 49, 50, 46, 45, 43, 47, 
48, 48, 46, 47, 46, 46, 44, 46, 44, 45, 49, 44, 46, 44, 48, 44, 
42, 44, 50, 44, 44, 48, 43, 43, 46, 44, 49, 49, 44, 42, 45, 45, 
48, 46, 45, 46, 43, 40, 50, 39, 42, 48, 44, 44, 46, 43, 47, 46, 
41, 43, 43, 46, 48, 45, 48, 43, 42)), .Names = c("datetime", 
"count"), row.names = c(NA, -74L), class = "data.frame")

>head(df)
             datetime count
1 2014-04-04 09:29:00    46
2 2014-04-04 09:39:00    45
3 2014-04-04 09:49:00    47
4 2014-04-04 09:59:00    43
5 2014-04-04 10:09:00    49
6 2014-04-04 10:19:00    46

Example code (to plots all datetimes):

#Convert datetime character string to POSIXct format
df$datetime = as.POSIXct(strptime(df$datetime, format="%d/%m/%Y %H:%M:%S"), tz="UTC")

plot(df$datetime, df$count, axes=FALSE)
axis(2,las=2)
axis.POSIXct(1, at=df$datetime, labels=format(df$datetime, “%H:%M")) #datetime format can be changed as desired
lines(df$datetime, df$count, col="grey22")

First thing first, let's correct your axis.POSIXct call:

axis.POSIXct(1, at=df$datetime, format="%H:%M")

Argument format let you define your time format without having to format each label one by one. The at argument is the one we are going to use to define where the ticks will be.

First you can define a sequence of date using seq applied to POSIXt objects (see ?seq.POSIXt ) where the argument by can be provided with custom names such as "3 hours" :

A character string, containing one of "sec", "min", "hour", "day", "DSTday", "week", "month" or "year". This can optionally be preceded by a (positive or negative) integer and a space, or followed by "s".

Therefore:

seq(df$datetime[1], tail(seq$datetime,1), by="3 hours")
# [1] "2014-04-04 09:29:00 UTC" "2014-04-04 12:29:00 UTC" "2014-04-04 15:29:00 UTC" "2014-04-04 18:29:00 UTC" "2014-04-04 21:29:00 UTC"

Now to make the sequence starts at a full hour, one need to use round (see ?round.POSIXt ):

round(df$datetime[1], "hour")
# [1] "2014-04-04 09:00:00 UTC"
seq(round(df$datetime[1],"hour"), tail(df$datetime,1), by="3 hours")
# [1] "2014-04-04 09:00:00 UTC" "2014-04-04 12:00:00 UTC" "2014-04-04 15:00:00 UTC" "2014-04-04 18:00:00 UTC" "2014-04-04 21:00:00 UTC"

To summarize, your code becomes:

df <- structure(list(datetime = structure(c(1396603740, 1396604340, 1396604940, 1396605540, 1396606140, 1396606740, 1396607340, 1396607940, 1396608540, 1396609140, 1396609740, 1396610340, 1396610940, 1396611540, 1396612140, 1396612740, 1396613340, 1396613940, 1396614540, 1396615140, 1396615740, 1396616340, 1396616940, 1396617540, 1396618140, 1396618740, 1396619340, 1396619940, 1396620540, 1396621140, 1396621740, 1396622340, 1396622940, 1396623540, 1396624140, 1396624740, 1396625340, 1396625940, 1396626540, 1396627140, 1396627740, 1396628340, 1396628940, 1396629540, 1396630140, 1396630740, 1396631340, 1396631940, 1396632540, 1396633140, 1396633740, 1396634340, 1396634940, 1396635540, 1396636140, 1396636740, 1396637340, 1396637940, 1396638540, 1396639140, 1396639740, 1396640340, 1396640940, 1396641540, 1396642140, 1396642740, 1396643340, 1396643940, 1396644540, 1396645140, 1396645740, 1396646340, 1396646940, 1396647540), class = c("POSIXct", "POSIXt"), tzone = "UTC"), count = c(46, 45, 47, 43, 49, 46, 46, 44, 44, 44, 45, 49, 50, 46, 45, 43, 47, 48, 48, 46, 47, 46, 46, 44, 46, 44, 45, 49, 44, 46, 44, 48, 44, 42, 44, 50, 44, 44, 48, 43, 43, 46, 44, 49, 49, 44, 42, 45, 45, 48, 46, 45, 46, 43, 40, 50, 39, 42, 48, 44, 44, 46, 43, 47, 46, 41, 43, 43, 46, 48, 45, 48, 43, 42)), .Names = c("datetime", "count"), row.names = c(NA, -74L), class = "data.frame")
plot(df$datetime, df$count, axes=FALSE)
axis(2,las=2)
axis.POSIXct(1, at=seq(from=round(df$datetime[1],"hour"),
                       to=tail(df$datetime,1),
                       by="3 hours"),
                format="%H:%M")
lines(df$datetime, df$count, col="grey22")

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM