Thanks a lot for this incredibly helpful and thorough reply. I had actually meant to cut out the scales part before sending the email, very sorry about the confusion, so I was actually executing just
xyplot(Comp ~ time | PC ,data = Xlong, pane1l = WeekhourPanel) The scales part was a later attempt to control the axis directly which I eventually abandoned. (partly because I actually wanted the HOUR variables to be local to the panel function) and yes, in this simplified version I asked for labels only at 8am which formats to "08". My intention was to add more hours and weekly labels once I figure out this simple axis first. I had hoped to define a panel function that draws only one PC at a time since I envision that grouping variable to have many levels (two were just an example). Might you know how to disable the axis drawing in panel.xyplot ? Thanks ! Markus On Fri, Sep 10, 2010 at 12:45 PM, Dennis Murphy <djmu...@gmail.com> wrote: > Hi: > > On Fri, Sep 10, 2010 at 7:16 AM, Markus Loecher > <markus.loec...@gmail.com>wrote: > >> Dear all, >> I am struggling to modify the axis labels/ticks in a panel provided to >> xyplot. >> To begin with, I do not know the equivalent of the xaxt="n" directive for >> panels that would set the stage for no default x axis being drawn. >> My goal is to draw ticks and custom formatted labels at certain hours of >> the >> week. >> When I execute the code below, I get an error message in the plot window >> that suggests a problem with some args parameter. >> >> A second problem concerns the shaded rectangles I try to draw. Clearly, >> the >> range returned by par('usr') does not correspond to the true y ranges. >> >> Any help would be greatly appreciated, >> >> Thanks, >> >> Markus >> >> PS I am using R version 2.10.0 on MACOS and the lattice package version >> 0.18-3 (latest) >> >> ------------------------------------------------------------------------------------ >> library(lattice); >> >> #multivariate time series, one row for each hour of the week: >> Xwide = cbind.data.frame(time=as.POSIXct("2010-09-06 00:00:00 EDT") + >> (0:167)*3600, Comp.1= sin(2*pi*7*(0:167)/168), Comp.2 = >> cos(2*pi*7*(0:167)/168)); >> #to pass this to xyplot, first need to reshape: >> Xlong <- reshape(Xwide, varying = c(2:3), idvar = "time", >> direction="long", >> timevar = "PC"); >> #get descriptive shingle labels >> Xlong[,"PC"] <- factor(Xlong[,"PC"], labels = paste("PC",1:2)); >> > > A less mentally taxing approach :) > > library(reshape) > xlong <- melt(Xwide, id = 'time') > names(xlong)[2:3] <- c('PC', 'Comp') > >> >> xyplot(Comp ~ time | PC ,data = Xlong, pane1l = WeekhourPanel, scales = >> list(x=list(at = Hours24-4*3600, >> labels=as.character(format(Hours24-4*3600,"%H"))))); >> > > When attempting to run this, I got > Error in xyplot.formula(Comp ~ time | PC, data = Xlong, pane1l = > WeekhourPanel, : > object 'Hours24' not found > > Attempting to pull Hours24 out of the function didn't work... > > > Hours24 <- seq(r[1]+12*3600, r[2], by=24*3600) > Error in seq(r[1] + 12 * 3600, r[2], by = 24 * 3600) : > object 'r' not found > > One problem is that to use Hours24 in scales, it has to be defined in the > calling environment of xyplot() - in other words, it has to be defined > outside the panel function and outside of xyplot() if your present code is > to have any hope of working. > > I think I got that part figured out: in the console, type > r <- range(Xwide$time) > > Hours24 <- seq(r[1]+12*3600, r[2], by=24*3600) > > I at least get a plot now by running your xyplot() function with the panel > function, but all the labels are 08 on the x-axis. Here's why: > > > format(Hours24-4*3600,"%H") > [1] "08" "08" "08" "08" "08" "08" "08" > > This comes from the labels = part of your panel function. I got the same > plot with this code (apart from adding the lines): > xyplot(Comp ~ time | PC ,data = Xlong, type = 'l', > scales =list(x = list(at = Hours24-4*3600, > > labels=as.character(format(Hours24-4*3600,"%H"))))) > > which indicates that something in your panel function is awry. > > I'd suggest starting out simply. Put both plots on the same panel using PC > as a grouping variable in the long data frame. It will automatically use > different colors for groups, but you can control the line color with the > col.lines = argument; e.g., col.lines = c('red', 'blue'). Next, I'd work on > getting the axis ticks and labels the way you want with scales. It also > appears that you want to set a custom grid - my suggestion would be to do > that last, after you've controlled the axis ticks and labels. Once you have > that figured out, you have the kernel of your panel function. In most > applications I've seen in lattice, the idea is to keep the panel function as > simple as possible and pass the 'global' stuff to the function call. There's > something broken in your panel function, but it's a run-time error rather > than a compile-time error, so you can either debug it or try simplifying the > problem (and the panel function) as much as possible. > > HTH, > Dennis > > WeekhourPanel <- function(x,y,...){ >> r <- range(x); >> #print(r) >> Hours8 <- seq(r[1], r[2], by=8*3600); >> Hours24 <- seq(r[1]+12*3600, r[2], by=24*3600) >> #axis.POSIXct(1, at= Hours8, format="%H"); >> panel.xyplot(x,y, type="l", ...); >> panel.grid(0,3); >> panel.abline(v= Hours24-4*3600, lty=2, col = rgb(0,0,1,0.5)); >> panel.abline(v=Hours24+6*3600, lty=2, col = rgb(0,1,0,0.5)); >> bb <- par('usr') >> y0 <- bb[3]; >> for (i in seq(r[1], r[2], by=48*3600)) panel.rect(xleft=i, ybottom=y0, >> xright=i+24*3600-1, ytop=bb[4], col = rgb(0.75,0.75,0.75,0.3), border = >> NA); >> panel.axis(1, at= Hours24-4*3600, >> labels=as.character(format(Hours24-4*3600,"%H"))); >> #panel.axis(1, at= Hours24+6*3600, labels=format(x,"%H")); >> #panel.axis(3, at= Hours24, labels=format(x,"%a"), line = -1, tick = >> FALSE); >> >> } >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help@r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide >> http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. >> > > [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.