[R] time plotting problem

John Kane jrkrideau at yahoo.ca
Wed Nov 14 17:39:36 CET 2007


Thank you Jim.  That does give better results.  I had
not realised how complicated a question I was asking. 


Both yours and Jim Lemon's solutions work very nicely.
  I am still messing up the syntax with Gabour's
approach. Thanks to all for the fast and valuable
help.

--- jim holtman <jholtman at gmail.com> wrote:

> I have had some problems with dates on axis in
> certain ranges.  Here
> is a version of axis.POSIXct that I have been using
> that seems to do a
> better job:
> 
>  my.axis.POSIXct <-
> function (side, x, format, inc)
> {
>     .diff <- diff(range(unclass(x), na.rm = TRUE))
>     if (.diff < 30) {
>         .by <- "sec"
>         .for <- "%M:%S"
>     }
>     else if (.diff < 5 * 60) {
>         .by <- "15 secs"
>         .for <- "%M:%S"
>     }
>     else if (.diff < 30 * 60) {
>         .by <- "2 min"
>         .for <- "%H:%M"
>     }
>     else if (.diff < 2 * 3600) {
>         .by <- "15 mins"
>         .for <- "%H:%M"
>     }
>     else if (.diff < 12 * 3600) {
>         .by <- "hour"
>         .for <- "%H:00"
>     }
>     else if (.diff < 48 * 3600) {
>         .by <- "6 hours"
>         .for <- "%d-%H"
>     }
>     else if (.diff < 7 * 24 * 3600) {
>         .by <- "12 hours"
>         .for <- "%d-%H"
>     }
>     else if (.diff < 14 * 24 * 3600) {
>         .by <- "day"
>         .for <- "%m/%d"
>     }
>     else {
>         .inc <- diff(pretty(x))[1]
>         if (.inc < 7 * 84600) {
>             .by <- paste(as.integer(.inc/86400),
> "days")
>         }
>         else {
>             .by <- paste(as.integer(.inc/(86400 *
> 7)) * 7, "days")
>         }
>         .for <- "%m/%d/%y"
>     }
>     .range <- range(x, na.rm = TRUE)
>     axis.POSIXct(side, at = seq(trunc(.range[1],
> "day"), trunc(.range[2] +
>         86400, "day"), by = ifelse(missing(inc),
> .by, inc)),
>         format = ifelse(missing(format), .for,
> format))
> }
> 
> With your code I did the following which may give
> you better results:
> 
> plot(as.POSIXct(mydata[,1]),mydata[,2],
> xlab="Dates", ylab="Blood
> pressure",
>       ylim=c(minmax[4], minmax[1]), col= "red",
> type="l", xaxt='n')
> my.axis.POSIXct(1, as.POSIXct(mydata[,1]))
> 
> 
> On Nov 13, 2007 9:08 AM, John Kane
> <jrkrideau at yahoo.ca> wrote:
> > I clearly spoke too soon.
> >
> > With the actual data I am not getting sensible
> x-axis
> > units.  The program with the actual data below. 
> Graph
> > output is here:
> > http://ca.geocities.com/jrkrideau/R/hd.png .
> >
> > I seem to be getting only a single entry for the
> > x-axis of "2007". However dates range from
> >  First Date    Last Date
> > "2006-09-26" "2007-11-10"
> >
> > I must be missing something blindingly obvious but
> I
> > don't see it.
> >
> > Thanks for any suggestions.
> >
> >
> > Actual data and test program
> > ================================================
> > mydata <-
> >
>
read.table("http://ca.geocities.com/jrkrideau/R/heartdata.txt",
> > sep="\t",
> >             header=FALSE)
> > mydata[,1] <- as.Date(mydata[,1],"%m/%d/%y")
> > names(mydata) <- Cs(dates, sy,dys,pulse, weight)
> > minmax  <-  c(max(mydata[,2]),min(mydata[,2]),
> > max(mydata[,3]),min(mydata[,3]))
> > names(minmax) <- c("maxsys", "minsys", "maxdsy",
> > "mindys") ; minmax
> >
> > min.max.dates <- c(min(mydata[,1]),
> max(mydata[,1]))
> > names(min.max.dates) <- c("First Date", "Last
> Date");
> > min.max.dates
> >
> > ss <- lm(mydata[,2]~mydata[,1])
> > plot(mydata[,1],mydata[,2], xlab="Dates",
> ylab="Blood
> > pressure",
> >       ylim=c(minmax[4], minmax[1]), col= "red",
> > type="l")
> > abline (ss, col ="yellow")
> > dd <- lm(mydata[,3]~mydata[,1])
> > points(mydata[,1], mydata[,3], type="l",
> col="blue" )
> > abline(dd, col= "yellow", lwd=2)
> >
> >
> >
> >
> >
> >
> > > Thanks to Gabor and Jim. I am not sure if the
> first
> > > entry year = 2009 is all the problem I'm getting
> but
> > > it is certainly seems like the worst of it.
> > >
> > > My stupidity:  Someone sent me the data set in
> Excel
> > >
> > > and I didn't do the basic data checks on. I
> _KNEW_
> > > the
> > > data went from 2006 to 2007.
> > >
> > > --- Gabor Grothendieck <ggrothendieck at gmail.com>
> > > wrote:
> > >
> > > > In your examples the first line of your data
> > > refers
> > > > to the
> > > > year 2009 and Oct 1st is repeated.  Is that
> really
> > > > what
> > > > you meant?
> > > >
> > > > I can't tell what your problem is from your
> > > > description
> > > > other than the data problems cited but there
> are
> > > > lots of
> > > > examples of plotting with zoo in the following
> > > which
> > > > may
> > > > help you:
> > > > vignette("zoo")
> > > > vignette("zoo-quickref")
> > > > ?plot.zoo
> > > > ?xyplot.zoo
> > > >
> > > > Note that zoo series must be time series, i.e.
> > > they
> > > > must
> > > > have unique times.
> > > >
> > > > On Nov 12, 2007 1:47 PM, John Kane
> >
> > > > > I am completely misunderstanding how to
> handle
> > > > dates.
> > > > > I want to plot a couple of data series
> against
> > > > some
> > > > > dates.  Simple example 1 below works fine.
> > > > > Unfortunately I have multiple observations
> per
> > > day
> > > > (no
> > > > > time breakdowns) and observations across
> years.
> > > > > (example 2 very simplistic version )
> > > > >
> > > > > Can anyone suggest a quick fix or point me
> to
> > > > > something to read?  I thought that zoo might
> do
> > > it
> > > > but
> 
=== message truncated ===



      Instant Messaging, free SMS, sharing photos and more... Try the new Yahoo! Canada Messenger at http://ca.beta.messenger.yahoo.com/



More information about the R-help mailing list