Dear List,
I have been writing a Lattice function to draw what we call
stratigraphic diagrams, these are diagrams with a panel for each species
showing a time series of abundance, but drawn vertically to represent
time passing from bottom of plot towards to top.
I am most of the way there with this now, but I want to do away with the
strip on each panel and instead draw a custom top axis with a single
tick mark (situated at the panel midpoint) with label equal to that
which would be used for the strip text. I can do all of this except get
the correct label. How do I get access to the factor level being plotted
in each panel within my custom axis function?
It may be easier to illustrate than explain, so here is a dummy example,
including a version of my custom axis function.
require(lattice)
## custom axis function
axis.VarLabs <- function(side, ...) {
if(isTRUE(all.equal(side, "top"))) {
M <- function(lims) min(lims) + (diff(lims) / 2)
xlim <- current.panel.limits()$xlim
panel.axis(side = side, outside = TRUE, at = M(xlim),
tck = 1, line.col = "black",
text.col = "black", rot = 45)
} else {
axis.default(side = side, ...)
}
}
## demo data
set.seed(123)
dat <- data.frame(X = rnorm(1000), Y = rpois(1000, 2),
fac = sample(gl(4, 500, labels = LETTERS[1:4])))
head(dat)
str(dat)
## xyplot with custom axis --- note I leave the strip on here to show
## that I want the labels to be A, B, C, D on the top axis ticks...
xyplot(Y ~ X | fac, data = dat, axis = axis.VarLabs, layout = c(4,1,1))
Notice how in this plot, because I have not specified a label the 'at'
value for this point is used. Is there a way to get at the factor levels
from within an axis function? If so, how?
Secondly, how do you ensure there is enough space around the plot to
draw the axis labels without truncation - as can be seen on the example
xyplot.
Thanks in advance,
Gavin
--
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
Dr. Gavin Simpson [t] +44 (0)20 7679 0522
ECRC, UCL Geography, [f] +44 (0)20 7679 0565
Pearson Building, [e] gavin.simpsonATNOSPAMucl.ac.uk
Gower Street, London [w] http://www.ucl.ac.uk/~ucfagls/
UK. WC1E 6BT. [w] http://www.freshwaters.org.uk
%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%
On 2010-05-26 4:03, Gavin Simpson wrote:> Dear List, > > I have been writing a Lattice function to draw what we call > stratigraphic diagrams, these are diagrams with a panel for each species > showing a time series of abundance, but drawn vertically to represent > time passing from bottom of plot towards to top. > > I am most of the way there with this now, but I want to do away with the > strip on each panel and instead draw a custom top axis with a single > tick mark (situated at the panel midpoint) with label equal to that > which would be used for the strip text. I can do all of this except get > the correct label. How do I get access to the factor level being plotted > in each panel within my custom axis function? > > It may be easier to illustrate than explain, so here is a dummy example, > including a version of my custom axis function. > > require(lattice) > > ## custom axis function > axis.VarLabs<- function(side, ...) { > if(isTRUE(all.equal(side, "top"))) { > M<- function(lims) min(lims) + (diff(lims) / 2) > xlim<- current.panel.limits()$xlim > panel.axis(side = side, outside = TRUE, at = M(xlim), > tck = 1, line.col = "black", > text.col = "black", rot = 45) > } else { > axis.default(side = side, ...) > } > } > > ## demo data > set.seed(123) > dat<- data.frame(X = rnorm(1000), Y = rpois(1000, 2), > fac = sample(gl(4, 500, labels = LETTERS[1:4]))) > head(dat) > str(dat) > > ## xyplot with custom axis --- note I leave the strip on here to show > ## that I want the labels to be A, B, C, D on the top axis ticks... > xyplot(Y ~ X | fac, data = dat, axis = axis.VarLabs, layout = c(4,1,1))# There must a better way, but this works; add labels = levels(dat$fac)[panel.number()], # to your panel.axis() call in axis.VarLabs.> Notice how in this plot, because I have not specified a label the 'at' > value for this point is used. Is there a way to get at the factor levels > from within an axis function? If so, how? > > Secondly, how do you ensure there is enough space around the plot to > draw the axis labels without truncation - as can be seen on the example > xyplot.# Look at the settings for layout.heights, especially # axis.top and top.padding: xyplot(...., par.settings = list(layout.heights list(axis.top = xxx, top.padding = xxx))) # (Shouldn't need both; I don't know which is more # suitable for you.) -Peter Ehlers