[R] [lattice] format and rotation of strip text
Tom Roche
Tom_Roche at pobox.com
Sun Nov 18 21:42:45 CET 2012
Thanks to the lattice gurus on this list, and having reference to the
excellent open-access Sarkar 2008
ISBN 978-0-387-75968-5
e-ISBN 978-0-387-75969-2
http://dx.doi.org/10.1007/978-0-387-75969-2
I now know how to label lattice panels by variable value: see thread
starting @
https://stat.ethz.ch/pipermail/r-help/2012-November/329450.html
(and demonstrated below). This allows me to use lattice::levelplot() to
display atmospheric data (gas concentrations) over a 3D space with
dimensions longitude, latitude, and (vertical) level ... but I would
like to fix a few things. Hopefully the following is a sufficiently
"small, self-contained example" (though it has 2 side questions
injected--answers to those are appreciated also):
# start example
library(reshape2)
library(lattice)
lon=11
lat=7
lev=5
len=lon*lat*lev
array.3d <- array(data=c(1:len), dim=c(lat, lon, lev))
# Rewrite the array values "more spatially," i.e., row-wise from
# bottom left. If there's a more-R-ish way to fill this array
# as specified, please let me know: I know 'for' loops are deprecated
# in R.
i=1
for (z in 1:lev) {
for (x in lat:1) {
for (y in 1:lon) {
array.3d[x,y,z]=i ; i=i+1
}
}
}
# produces (with rows=latitudes and cols=longitudes)
array.3d[,,1]
array.3d[,,lev]
# convert data=array.3d to dataframe with reshape2::melt
array.3d.df <- melt(array.3d, varnames=c("lat","lon","lev"), value.name="conc")
head(array.3d.df)
tail(array.3d.df)
# make level values {longer, "more realistic"}
array.3d.df$lev <- array.3d.df$lev + 0.12345
head(array.3d.df)
tail(array.3d.df)
# plot "appropriately" for atmospheric data where lev=pressure: use
# * lattice::levelplot
# * one column, since atmospheric levels stack vertically
# * rev(lev), since layers closer to ground level have higher pressure
levelplot(
conc ~ lon * lat | rev(lev), data=array.3d.df,
layout=c(1,lev), # show levels stacked in 1 vertical column
strip=FALSE, # this suppresses printing strips atop packets
strip.left=strip.custom(
strip.levels=TRUE, # print level values
strip.names=FALSE # don't print name of level variable="rev(lev)"
)
)
# end example
Note that the (colored) 'strip' for each panel in the lattice has
- the corresponding layer value printed inside curly brackets, e.g.,
'{1.12345}'
- the layer value printed in full
- the layer value rotated 90° CCW (like the y-axis label)
I would prefer to have
+ the layer value *not* printed inside curly brackets
+ the layer value *not* rotated 90° CCW (i.e., to print the layer value
like the x-axis label)
+ the layer value truncated or rounded to some significant digits,
e.g., '1.1'
I suspect this can be done with strip.custom, but am not seeing how;
please enlighten!
Your assistance is appreciated, Tom Roche <Tom_Roche at pobox.com>
More information about the R-help
mailing list