Re: [R] lattice and several groups

From: Gabor Grothendieck <ggrothendieck_at_gmail.com>
Date: Thu 31 Aug 2006 - 14:13:23 EST

In thinking about this a bit more we can use panel.superpose/panel.groups to shorten it:

# define data -- df

# note that your val2 and val3 lines had a syntax
# so we have commented them out and
# replaced them as shown.

n <- 18
x1 <- seq(1,n)
val1 <- -2*x1+50
# val2 <- (-2*(x1-8)2)+100
val2 <- (-2*(x1-8))+100
# val3 <- (-2*(x1-8)2)+50
val3 <- (-2*(x1-8))+50
y <- c(val1,val2,val3)
x <- rep(x1,3)
f1 <- rep(c("mod1","mod2","mod3"),each=n/3)
f1 <- rep(f1,3)
f2 <- rep(c("g1","g2","g3"),each=n)
df <- data.frame(x=x,y=y,f1=f1,f2=f2)

surveys <-
factor(c(rep("survey1",n*3),rep("survey2",n*3),rep("survey3",n*3))) df <- rbind(df,df,df)
df <- data.frame(df,surveys=surveys)

# create xyplot

library(lattice)
library(grid)

# set custom col and pch here
my.col <- 1:nlevels(df$f2)
my.pch <- 1:nlevels(df$f1)

pnl <- function(x, y, subscripts, pch, type, ...)

   panel.xyplot(x, y, type = type, pch = my.pch[df[subscripts, "f1"]], ...)         

xyplot(y ~ x | surveys, data = df, groups = df$f2, type = "b",

        panel = panel.superpose,
        panel.groups = pnl,
        par.settings = list(superpose.line = list(col = my.col),
           superpose.symbol = list(col = my.col))
)

key1 <- list(border = TRUE, colums = 2, text = list(levels(df$f1)),

       points = list(pch = my.pch)
)

key2 <- list(border = TRUE, colums = 2, text = list(levels(df$f2)),

       lines = list(col = my.col)
)

draw.key(key1, draw = TRUE, vp = viewport(.9, .9)) draw.key(key2, draw = TRUE, vp = viewport(.75, .9))

On 8/30/06, Gabor Grothendieck <ggrothendieck@gmail.com> wrote:
> Or maybe this is what you are looking for where pnl below was
> created by modifying source to the panel.plot.default in the zoo
> package (there might be a simpler way):
>
>
> pnl <- function (x, y, subscripts, groups, col, pch, type, ...) {
> for (g in levels(groups)) {
> idx <- g == groups[subscripts]
> if (any(idx))
> panel.xyplot(x[idx], y[idx], ..., col = col[subscripts][idx],
> pch = pch[subscripts][idx], type = type)
> }
> }
>
> xyplot(y ~ x | surveys, data = df, groups = df$f2, type = "b",
> col = as.numeric(df$f2), pch = as.numeric(df$f1), panel = pnl)
>
>
> key1 <- list(border = TRUE, colums = 2, text = list(levels(df$f1)),
> points = list(pch = 1:nlevels(df$f1))
> )
>
> key2 <- list(border = TRUE, colums = 2, text = list(levels(df$f2)),
> points = list(pch = 20, col = 1:nlevels(df$f2))
> )
>
> draw.key(key1, draw = TRUE, vp = viewport(.9, .9))
> draw.key(key2, draw = TRUE, vp = viewport(.75, .9))
>
>
>
>
> On 8/30/06, Gabor Grothendieck <ggrothendieck@gmail.com> wrote:
> > To handle conditioning on survey we provide a panel function
> > that subsets col and pch:
> >
> > # define test data - df
> >
> > # note that your val2 and val3 lines had a syntax
> > # so we have commented them out and
> > # replaced them as shown.
> > n <- 18
> > x1 <- seq(1,n)
> > val1 <- -2*x1+50
> > # val2 <- (-2*(x1-8)2)+100
> > val2 <- (-2*(x1-8))+100
> > # val3 <- (-2*(x1-8)2)+50
> > val3 <- (-2*(x1-8))+50
> > y <- c(val1,val2,val3)
> > x <- rep(x1,3)
> > f1 <- rep(c("mod1","mod2","mod3"),each=n/3)
> > f1 <- rep(f1,3)
> > f2 <- rep(c("g1","g2","g3"),each=n)
> > df <- data.frame(x=x,y=y,f1=f1,f2=f2)
> > surveys <-
> > factor(c(rep("survey1",n*3),rep("survey2",n*3),rep("survey3",n*3)))
> > df <- rbind(df,df,df)
> > df <- data.frame(df,surveys=surveys)
> >
> > # create xyplot
> >
> > library(lattice)
> > library(grid)
> >
> > pnl <- function(x, y, groups, subscripts, col, pch, ...)
> > panel.xyplot(x, y, col = col[subscripts], pch = pch[subscripts], ...)
> >
> > xyplot(y ~ x | surveys, data = df,
> > col = as.numeric(df$f1), pch = as.numeric(df$f2), panel = pnl)
> >
> >
> > key1 <- list(border = TRUE, colums = 2, text = list(levels(df$f1)),
> > points = list(pch = 1:nlevels(df$f1))
> > )
> >
> > key2 <- list(border = TRUE, colums = 2, text = list(levels(df$f2)),
> > points = list(pch = 20, col = 1:nlevels(df$f2))
> > )
> >
> > # add legend
> >
> > draw.key(key1, draw = TRUE, vp = viewport(.9, .9))
> > draw.key(key2, draw = TRUE, vp = viewport(.75, .9))
> >
> >
> > On 8/30/06, Laurent Rhelp <laurentRhelp@free.fr> wrote:
> > > Gabor Grothendieck a écrit :
> > >
> > > >Note that before entering this you need:
> > > >
> > > >library(lattice)
> > > >library(grid) # to access the viewport function
> > > >
> > > >On 8/29/06, Gabor Grothendieck <ggrothendieck@gmail.com> wrote:
> > > >
> > > >
> > > >>Try this:
> > > >>
> > > >>xyplot(val ~ x, data = df, type = "p",
> > > >> col = as.numeric(df$f1), pch = as.numeric(df$f2))
> > > >>
> > > >>key1 <- list(border = TRUE, colums = 2, text = list(levels(df$f1)),
> > > >> points = list(pch = 1:nlevels(df$f1))
> > > >>)
> > > >>
> > > >>key2 <- list(border = TRUE, colums = 2, text = list(levels(df$f2)),
> > > >> points = list(pch = 20, col = 1:nlevels(df$f2))
> > > >>)
> > > >>
> > > >>trellis.focus("panel", 1, 1)
> > > >>draw.key(key1, draw = TRUE, vp = viewport(.9, .9))
> > > >>draw.key(key2, draw = TRUE, vp = viewport(.75, .9))
> > > >>trellis.unfocus()
> > > >>
> > > >>
> > > >>On 8/29/06, Laurent Rhelp <laurentRhelp@free.fr> wrote:
> > > >>
> > > >>
> > > >>>Dear R-list,
> > > >>>
> > > >>> I would like to use the lattice library to show several groups on
> > > >>>the same graph. Here's my example :
> > > >>>
> > > >>>## the data
> > > >>>f1 <- factor(c("mod1","mod2","mod3"),levels=c("mod1","mod2","mod3"))
> > > >>>f1 <- rep(f1,3)
> > > >>>f2 <- factor(rep(c("g1","g2","g3"),each=3),levels=c("g1","g2","g3"))
> > > >>>df <- data.frame(val=c(4,3,2,5,4,3,6,5,4), x=rep(c(1,2,3),3),f1=f1,f2=f2)
> > > >>>#############################################################
> > > >>>library(lattice)
> > > >>>
> > > >>>para.liste <- trellis.par.get()
> > > >>>superpose.symbol <- para.liste$superpose.symbol
> > > >>>superpose.symbol$pch <- c(1,2,3)
> > > >>>trellis.par.set("superpose.symbol",superpose.symbol)
> > > >>>
> > > >>># Now I can see the group according to the f1 factor (with a different
> > > >>>symbol for every modality)
> > > >>>xyplot( val~x,
> > > >>> data=df,
> > > >>> group=f1,
> > > >>> auto.key=list(space="right")
> > > >>> )
> > > >>>
> > > >>># or I can see the group according to the f2 factor
> > > >>>xyplot( val~x,
> > > >>> data=df,
> > > >>> type="l",
> > > >>> group=f2,
> > > >>> auto.key=list(space="right",points=FALSE,lines=TRUE)
> > > >>> )
> > > >>>
> > > >>>How can I do to highlight both the f1 and f2 factors on one panel with
> > > >>>the legends, using the lattice function ?
> > > >>>
> > > >>>Thanks
> > > >>>
> > > >>>______________________________________________
> > > >>>R-help@stat.math.ethz.ch mailing list
> > > >>>https://stat.ethz.ch/mailman/listinfo/r-help
> > > >>>PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> > > >>>and provide commented, minimal, self-contained, reproducible code.
> > > >>>
> > > >>>
> > > >>>
> > > >
> > > >______________________________________________
> > > >R-help@stat.math.ethz.ch mailing list
> > > >https://stat.ethz.ch/mailman/listinfo/r-help
> > > >PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> > > >and provide commented, minimal, self-contained, reproducible code.
> > > >
> > > >
> > > >
> > > >
> > > Thank you, Gabor. The way to put the two legends is very interesting.
> > > For the graphs, in fact, my problem is to fit the data for every level
> > > of the f2 factor, showing the levels of the f1 factor in each panel and
> > > that for several surveys . Here's an example closer to my actual data :
> > >
> > > ## the data
> > >
> > > n <- 18
> > > x1 <- seq(1,n)
> > > val1 <- -2*x1+50
> > > val2 <- (-2*(x1-8)2)+100
> > > val3 <- (-2*(x1-8)2)+50
> > > y <- c(val1,val2,val3)
> > > x <- rep(x1,3)
> > > f1 <- rep(c("mod1","mod2","mod3"),each=n/3)
> > > f1 <- rep(f1,3)
> > > f2 <- rep(c("g1","g2","g3"),each=n)
> > > df <- data.frame(x=x,y=y,f1=f1,f2=f2)
> > >
> > > surveys <-
> > > factor(c(rep("survey1",n*3),rep("survey2",n*3),rep("survey3",n*3)))
> > > df <- rbind(df,df,df)
> > > df <- data.frame(df,surveys=surveys)
> > > #######################################################################
> > > library(lattice)
> > >
> > > para.liste <- trellis.par.get()
> > > superpose.symbol <- para.liste$superpose.symbol
> > > superpose.symbol$pch <- c(1,2,3)
> > > trellis.par.set("superpose.symbol",superpose.symbol)
> > >
> > > xyplot( y~x | surveys, data=df,
> > > group=f1,
> > > auto.key=list(space="right")
> > > )
> > >
> > > xyplot( y~x | surveys ,
> > > data=df,
> > > type="l",
> > > group=f2,
> > > auto.key=list(space="right",points=FALSE,lines=TRUE)
> > > )
> > >
> > > Certainly, I have to use the panel function but I don't know how to mark
> > > the f1 factor in each panel (I want to fit the values according to the
> > > f2 factor) !
> > >
> > >
> > >
> >
>



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Thu Aug 31 16:56:17 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Mon 04 Sep 2006 - 02:23:34 EST.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.