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.