[R] Auto.key colors maintained when subsetting
Deepayan Sarkar
deepayan.sarkar at gmail.com
Wed Jul 9 22:58:39 CEST 2008
On 7/9/08, David Afshartous <dafshartous at med.miami.edu> wrote:
>
>
>
> On 7/9/08 1:07 PM, "Deepayan Sarkar" <deepayan.sarkar at gmail.com> wrote:
>
> > On 7/9/08, David Afshartous <dafshartous at med.miami.edu> wrote:
> >>
> >>
> >> All,
> >>
> >> I'm plotting points and lines for various groups.
> >> I'd like subsequent plots done on subsets to maintain the color assignments
> >> from the original plot. This works fine, but the key for the subset doesn't
> >> maintain the correspondence. One solution is to reprint the entire key, but
> >> this is undesirable since then the key has more elements than the groups in
> >> the plot. Reproducible example below.
> >
> > Well, the ideal solution would have been for auto.key to magically
> > omit the levels of 'groups' that are omitted by the application of
> > 'subset', but there is not enough information available to it for this
> > to happen. One option is to
> >
> > 1. subset the data beforehand, and drop unsed levels with Group[drop=TRUE]
>
> This will work, but unfortunately the color correspondence across plots will
> be lost. Leading to a preference for your second suggestion:
I meant both 1 and 2 together...but in any case, the other option is
easier, I think.
> > 2. supply colors, etc. explicitly through 'par.settings'.
>
> The code below works, but when extended to include error bars (panel.ci, and
> prepanel.ci), it works for the full data but not the subset.
[...]
> > The other option is to construct your own key (i.e., use the 'key'
> > argument, not 'auto.key', to specify the legend).
>
> Below is an attempt to use key; although the plot is correct, in the key the
> color is applied to the text instead of the line and the line type isn't
> drawn:
>
>
> xyplot(Y ~ Hour,
> data = dat, pch = 16,
> subset = (Group != "A"),
>
> groups=Group, col=c('red', 'black', 'green', 'blue'),
> type="b",
> key = simpleKey(text = levels(Group)[2:4], lty = c(2,3,4),
> space = "top", columns = 3, points = FALSE, lines = TRUE,
> col = c('black', 'green', 'blue'))
> par.settings = list(superpose.line = list(lty = c(1,2,3,4),
> col=c('red', 'black', 'green', 'blue')
> ) ) )
simpleKey() won't be of much help; I meant the use of a manually
constructed 'key', e.g.:
all.colors <- c('red', 'black', 'green', 'blue')
lgroups <- levels(dat$Group)
skip <- 1 ## or skip <- 2, skip <- c(1, 2), etc.
xyplot(Y ~ Hour, data = dat, groups = Group,
subset = (Group %in% lgroups[-skip]),
type = "b",
pch = 16, col = all.colors,
key = list(space = "top", columns = 3,
text = list(lgroups[-skip]),
lines = list(col = all.colors[-skip])))
-Deepayan
> #############################
> Data and necessary functions:
> set.seed(101)
>
> Y = c(rnorm(4,0), rnorm(4,2), rnorm(4,6), rnorm(4,8))
>
> dat = data.frame(
> Y , lower.bound = Y - .5, upper.bound = Y + .5,
>
> Group = factor(c(rep("A", 4), rep("B", 4), rep("C", 4), rep("D", 4))),
>
> Hour = rep(c(1:4), 4)
> )
>
> prepanel.ci <- function(x, y, ly, uy, subscripts, ...) {
> x <- as.numeric(x)
> ly <- as.numeric(ly[subscripts])
> uy <- as.numeric(uy[subscripts])
> list(ylim = range(y, uy, ly, finite = TRUE)) }
> panel.ci <- function(x, y, ly, uy, subscripts, pch = 16, ...) {
> x <- as.numeric(x)
> y <- as.numeric(y)
> ly <- as.numeric(ly[subscripts])
> uy <- as.numeric(uy[subscripts])
> panel.arrows(x, ly, x, uy, col = "black",
> length = 0.25, unit = "native",
> angle = 90, code = 3)
> panel.xyplot(x, y, pch = 16, ...)}
>
> > It should be simple
> > to write a function that constructs a suitable 'key' argument given
> > the levels that are to be omitted/retained.
> >
> > -Deepayan
>
>
More information about the R-help
mailing list