# [R-SIG-Finance] working levelplot with zoo - surface plot of multivariate time series

Christian Gunning icos.atropa at gmail.com
Wed Jun 3 06:17:12 CEST 2009

```On Tue, Jun 2, 2009 at 3:00 AM,
<r-sig-finance-request at stat.math.ethz.ch> wrote:
>
> Now I want to get "surface plot" wherein x-axis is time, y-axis represents
> 1,2,3,4, and z-axis is for values of "dat2". Is there any R drawing device
> to do that?
>

I just ran into this independently.  Is a method of levelplot for zoo
objects on anyone's horizon?  Nontrivial?  I got the following to
work:

start = as.Date("01/01/05", format="%m/%d/%y")
end = as.Date("12/31/05", format="%m/%d/%y")
dates = seq(start, end, by=1)

dat = matrix(rnorm(length(dates)*4), length(dates))
dat1 = t(apply(dat, 1, function(x) x+t(c(100, 110, 120, 130))))

library(zoo)

### With Date index This works, but it isn't pretty:

mylab=lattice:::formattedTicksAndLabels.Date(index(dat2))
levelplot(coredata(dat2),
scales=list(x=list(rot=90,at=mylab\$at-mylab\$num.limit,
labels=mylab\$labels)), aspect='fill')

This only works for dates, where the index vector increment and the
numeric representation of the Date increment are both 1. You can
subtract out "mylab\$num.limit" to get them to align.  This doesn't
work for POSIXct, where the numeric representation of the POSIXct
increment is in seconds (unless the index vector is by second). Here,
I extract the numeric representation of dt from the index vector, and
divide the "at" vector by dt to align it with the labels.  It works,
just really messy.

### With POSIXct index
start =as.Date("01/01/05", format="%m/%d/%y")
end = as.Date("12/31/05", format="%m/%d/%y")
dates = as.POSIXct(seq(start, end, by=1)) ####changed

dat = matrix(rnorm(length(dates)*4), length(dates))
dat1 = t(apply(dat, 1, function(x) x+t(c(100, 110, 120, 130))))

mylab=lattice:::formattedTicksAndLabels.POSIXct(index(dat2))
mylab.at = (mylab\$at-mylab\$num.limit)/(as.numeric(dates)-as.numeric(dates))

levelplot(coredata(dat2), scales=list(x=list(rot=90,at=mylab.at,
labels=mylab\$labels)), aspect='fill')
###################

hope this helps,
christian

--
Far better an approximate answer to the right question, which is often
vague, than the exact answer to the wrong question, which can always
be made precise -- j.w. tukey

```