lattice: adding text between grouped panels?
--- In reply to Deepayan Sarkar: ---
Date: 20.01.04 10:40 (-0600)
Thank you again for your very helpful and inspiring answer! Some additional questions will follow below.
On Tuesday 20 January 2004 04:14, Wolfram Fischer wrote:
How one can add a text (e.g. the labels of an axis) in a space between grouped panels which was created by using the argument ``between''? Example: data(barley) dotplot(variety ~ yield | site * year, data=barley, between=list(x=c( 0, 0, 6 )) How to add labels for the y axis in the space in the middle?
Formally, there's no mechanism to do that. However, most reasonable usage can
be achieved by the panel function, e.g. (to add a y-axis tick and label at
the mean y-value):
panel = function(x, y, ...) {
panel.xyplot(x, y, ...)
grid.yaxis(at = mean(y))
}
Normally, this would not work because all graphical output produced by the
panel function is 'clipped', i.e., anything falling outside the panel is not
drawn. This can be controlled by the setting
trellis.par.get("clip")
$panel [1] TRUE $strip [1] TRUE So you need to do something like
lset(list(clip = list(panel = FALSE)))
before calling xyplot (or whatever). Of course, turning clipping off has the disadvantage that unintended things can happen. Most panel functions are safe, but some are not (like panel.abline).
This good idea seams to work. But: - How can I determine in which panel I am? Principally I could to that by using a strip function. But the presence of a strip function allways (?) allocates space for the strip(s). How can I determine the panel when I don't want to display strips?
Just in case you missed it, there's a much safer way to add customized tick
marks and labels to each panel, using the scales argument. From ?xyplot,
scales: list determining how the x- and y-axes (tick marks and
[...]
at: location of tick marks along the axis (in native
coordinates), or a list as long as the number of panels
describing tick locations for each panel.
labels: Labels (strings or expressions) to go along with
'at'. Can be a list like 'at' as well.
But this may not be what you want.
Thanks for this hint! When I wanted add labels to each panel group of: my.barley <- subset( barley, ! ( site == "Grand Rapids" & year == "1932" ) ) with( my.barley, dotplot(variety ~ yield | year * site, layout=c(6,2) , between=list(x=c(0,6)))) I tried: with( my.barley, dotplot(variety ~ yield | year * site, layout=c(6,2) , scales=list( rot=0, y=list( relation='sliced' , at = rep( list( 1: nlevels( variety ), NULL ), 6 ))))) I used: - ``sliced'' because there was an error when I did not use it: "the at and labels components of scales may not be lists when relation = same". - the at-option to eliminate the yaxis-labels within the panel groups. I received: - Several warning messages. - No axis labels for panel groups with an empty first panel. - Gigant scales in the second panels of each panel group. What can I do to: - Have normal scales in the second panels of each panel group? - Eliminate the space between the first and the second panel in each group.
Hth, Deepayan
Thanks! Wolfram