Skip to content

Plotting times at night and getting plot limits correct

7 messages · Thierry Onkelinx, Peter Dalgaard, Richard M. Heiberger +3 more

#
I'm helping colleagues with analysis of frog calls at night, and they
want to plot call statistics against time. This means we hit a
problem: we want the x-axis to start at (say) 18:00 and end at (say)
06:00. I'm reluctant to use the date as well, because we have data
from several dates, but only want to plot against time of day.

Here's some code to illustrate the problem (don't worry about the data
being outside the range of the plot: this is only for illustration).

library(chron)
Times <- chron(times.=paste(c(18:23,0:9),":30:00", sep=""))
Thing <- rnorm(length(Times)) # just something for the y-axis

plot(Times,Thing) # x-axis wrong
plot(Times,Thing, xlim=chron(times.=c("05:00:00", "18:00:00"))) # x-axis right
plot(Times,Thing, xlim=chron(times.=c("18:00:00", "05:00:00"))) #
would like this to work...

Can anyone suggest a solution?

Bob
#
Dear Bob,

Is this useful?

library(lubridate)
library(ggplot2)
n <- 100
h <- sample(c(18:23, 0:9), size = n, replace = TRUE)
m <- sample(0:59, size = n, replace = TRUE)
d <- sample(1:3, size = n, replace = TRUE)
dataset <- data.frame(
  Time = as.POSIXct(paste0("2015-01-", d, " ", h, ":", m, ":0")),
  Thing = rnorm(n)
)
dataset$rTime <- round_date(dataset$Time, unit = "day")
dataset$Time2 <- dataset$Time - dataset$rTime + min(dataset$rTime)
ggplot(dataset, aes(x = Time2, y = Thing, colour = factor(rTime))) +
geom_point()

Best regards,


ir. Thierry Onkelinx
Instituut voor natuur- en bosonderzoek / Research Institute for Nature and
Forest
team Biometrie & Kwaliteitszorg / team Biometrics & Quality Assurance
Kliniekstraat 25
1070 Anderlecht
Belgium

To call in the statistician after the experiment is done may be no more
than asking him to perform a post-mortem examination: he may be able to say
what the experiment died of. ~ Sir Ronald Aylmer Fisher
The plural of anecdote is not data. ~ Roger Brinner
The combination of some data and an aching desire for an answer does not
ensure that a reasonable answer can be extracted from a given body of data.
~ John Tukey

2015-05-12 16:34 GMT+02:00 Bob O'Hara <rni.boh at gmail.com>:

  
  
#
On 12 May 2015, at 16:34 , Bob O'Hara <rni.boh at gmail.com> wrote:

            
What do you do during the daytime then?
It may be sheer luck, but this seems to work OK:
I think the chron route is doomed because of the fundamental confusion between going backwards in time and crossing midnight. With a little diligence you should be able to shift dates to a common origin.

-pd

  
    
#
Try this.
This places the times you are interested in into the range 00:00:00 - 12:00:00
Remove the date from these adjusted date-time values and plot y
against the new times.
Take control of the tick-labels and display 18:00 - 0600 instead of
the default 00:00 - 12:00

Rich
On Tue, May 12, 2015 at 10:34 AM, Bob O'Hara <rni.boh at gmail.com> wrote:
1 day later
#
Hi Bob,
Given the other answers I may be off target, but perhaps this will help:

# create two "nights" worth of data
Times<-strptime(
 paste(c("2015-05-13","2015-05-14"),paste(rep(c(18:23,0:6),2),":30:00",sep="")),
 "%Y-%m-%d %H:%M:%S")
# telescope the two nights into repeated hours
Hours<-strptime(format(Times,"%H:%M:%S"),"%H:%M:%S")
# get a measure that can be checked for the correct output
calls_per_hour<-sample(10:100,length(Hours))
# plot the repeated values - looks okay
plot(Hours,calls_per_hour)
# now calculate the mean values for each hourly measurement
mean_calls_per_hour<-by(calls_per_hour,as.character(Hours),mean)
# plot the means, making sure that the orders match
plot(sort(unique(Hours)),mean_calls_per_hour)

Jim
On Wed, May 13, 2015 at 1:20 AM, Richard M. Heiberger <rmh at temple.edu> wrote:
#
I might do it this way using Jim's sample data:

epoch <- as.POSIXct( "1970-01-01" ) # any date you like
dta <- data.frame( Timestamps = epoch
                               + as.difftime( ifelse( Times >= 5/24
                                                    , Times
                                                    , Times + 1 )
                                            , units="days" )
                  , Thing=Thing
                  )
brks <- epoch + as.difftime( seq( 5, 29, 1 ), units="hours" )
plot( Thing ~ Timestamps, dta, xaxt="n", xlim=c( min(brks), max(brks) ) )
axis.POSIXct( 1, at=brks, format="%H:%M" )

or, using ggplot2 instead of base graphics:

library(ggplot2)
library(scales)
ggplot( dta, aes( x=Timestamps, y=Thing ) ) +
     geom_point() +
     scale_x_datetime( breaks=brks
                     , limits=c( min(brks), max(brks) )
                     , labels=date_format("%H:%M") ) +
     theme( axis.text.x = element_text( angle = 90, hjust = 1 ) )
On Thu, 14 May 2015, Jim Lemon wrote:

            
---------------------------------------------------------------------------
Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<jdnewmil at dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...
                                       Live:   OO#.. Dead: OO#..  Playing
Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
/Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k
#
Thanks Thierry, Peter, Richard, Jim and Jeff for your help! In the end
I used Thierry's suggetion, in essence to add a day onto the sequences
that start after midnight, and this seems to work fine.

Bob
P.S. What I do during the day is my business, even if it mainly sems
to involve feeding frozen fruit & yoghurt to parrots...
On 14 May 2015 at 17:56, Jeff Newmiller <jdnewmil at dcn.davis.ca.us> wrote: