[R] problem with user defined panel function in xyplot

Monica Pisica pisicandru at hotmail.com
Fri Sep 14 15:58:00 CEST 2012





Hi everyone,

 

I am trying to do a horizonplot using my own time series
data. I know that there is a horizonplot function in latticeExtra, but on
closer examination i think that the graph itself is slightly wrong (it displays
some regions as triangles and i think they should be trapezoids, and the red
regions (that are below the baseline) are displayed on top of the blue areas …
while i think they should be next to each other with no overlap between red and
blue.

 

So using the library gbclip i did my own horizonplot
function that displays the graph as i want it. Now i want to use this graph as
a panel function in xyplot function from lattice to get the nice lattice type
of graph for all my categories in my time series. And ….. i am getting this
error:" Error using packet 1, Argument "ts01" is missing with no
default"fFor each of my columns.

 

Now my function called panel.tsfold takes as argument one
column from a time series or a zoo object that has only 1 time series. How can
i make the xyplot function to send to the panel function one column from the
bigger time series dataset?

 

My command that gives me error is: xyplot(ts00,
panel =panel.tsfold)

 

Thanks so much for any help,


Monica

 

Following is my function in case you would like to play
with it:

 

library(zoo)

library(latticeExtra)

library(gpclib)

 

setGeneric("translate.poly",
function(x, ...)

          
standardGeneric("translate.poly"))

 

setMethod("translate.poly",
signature(x = "gpc.poly"), 

          function(x, xscale=NA, yscale=NA,
...) {

              x at pts <- lapply(x at pts,
function(p) {

                  if (!is.na(xscale)) p$x <-
p$x + xscale

                  if (!is.na(yscale)) p$y <-
p$y + yscale

                  p

              })

              x

          })

 

 

setGeneric("flip.poly",
function(x, ...)

           standardGeneric("flip.poly"))

 

setMethod("flip.poly",
signature(x = "gpc.poly"), 

          function(x, dir=dir, ...) {

              x at pts <- lapply(x at pts,
function(p) {

                  if (dir == "up")
p$y <- 2*max(p$y)-p$y

                  if (dir == "down")
p$y <- 2*min(p$y)-p$y

                  p

              })

              x

          })

 

panel.tsfold <- function(ts01, col.reg =
c("lightblue", "#468CC8", "#0165B3",
"pink", "#E03231", "#B41414"), xlab = NA, ylab =
NA) {

if (!is.null(dim(ts01)))  ts01 <- ts00[,1]

bl <- coredata(ts01)[1]

y2 <- rep(bl, length(ts01))

ymin <- min(coredata(ts01), y2)

 

#vertices for
area under y1 

mat1 <-
cbind(c(index(ts01)[1], index(ts01), index(ts01)[length(index(ts01))]), c(ymin,
coredata(ts01), ymin))

 

#vertices for
area under y2

mat2 <-
cbind(c(index(ts01)[1],index(ts01), index(ts01)[length(index(ts01))]), c(ymin,
y2, ymin))

 

pp2 <-
as(mat2, "gpc.poly")

pp1 <-
as(mat1, "gpc.poly")

 

m <-max( (max(coredata(ts01)) - bl)/3,
abs(min(coredata(ts01)) - bl)/3)

m1 <- bl+m

m2 <- bl+2*m

 

##### cutting the blue poly above the baseline

# poly above the baseline

s1 <- setdiff(pp1, pp2)

y2 <- rep(m1, length(index(ts01)))

mat2a <-
cbind(c(index(ts01)[1],index(ts01), index(ts01)[length(index(ts01))]),
c(bl[[1]], y2, bl[[1]]))

pp2a <- as(mat2a,
"gpc.poly")

 

# poly above
baseline between baseline and first horizontal line at m1

sa1 <-
intersect(pp2a,s1)

 

# remaining
polygon - translate polygon down using my translate.poly function

s2 <- translate.poly(setdiff(s1, pp2a), yscale = -m)

 

# poly below the baseline

sb2 <- setdiff(pp2, pp1)

 

# poly below
the baseline flipped on top of the base line

sbf2 <-
flip.poly(sb2, dir = "up")

 

y2 <- rep(m1, length(index(ts01)))

mat2b <-
cbind(c(index(ts01)[1],index(ts01), index(ts01)[length(index(ts01))]), c(bl[[1]],
y2, bl[[1]]))

pp2b <-
as(mat2b, "gpc.poly")

 

# poly above
baseline between baseline and first horizontal line at m1

sb1 <-
intersect(pp2b,sbf2)

 

# remaining
polygon

# translate polygon down using my translate.poly function

sb2 <- translate.poly(setdiff(sbf2, pp2b), yscale = -m)

 

# doing the graph

plot(index(ts01),
y2,  type="n", xlab = xlab,
ylab = ylab, ylim = c(bl[[1]], m1[[1]]))

 

plot(intersect(pp2a,s1),
poly.args=list(col=col.reg[1], border=col.reg[1]), add=TRUE)

plot(intersect(pp2a,s2),
poly.args=list(col=col.reg[2], border=col.reg[2]), add=TRUE)

plot(translate.poly(setdiff(s2,
pp2a), yscale = -m), poly.args=list(col=col.reg[3], border=col.reg[3]), add=TRUE)

 

plot(intersect(pp2b,sb1),
poly.args=list(col=col.reg[4], border=col.reg[4]), add=TRUE)

plot(intersect(pp2b,sb2),
poly.args=list(col=col.reg[5], border=col.reg[5]), add=TRUE)

plot(translate.poly(setdiff(sb2,
pp2b), yscale = -m), poly.args=list(col=col.reg[6], border=col.reg[6]), add=TRUE)

 

}

 

 



 		 	   		  


More information about the R-help mailing list