Many thanks, I think I got the spirit of 'capturing and overriding' the arguments which was the bit i was missing. It's much clearer now with a working example.

Thanks again,

baptiste


On 7 Oct 2008, at 21:19, Deepayan Sarkar wrote:

On Tue, Oct 7, 2008 at 8:54 AM, baptiste auguie <[EMAIL PROTECTED]> wrote:
Dear list,


I've been trying this for a few hours and I just don't understand how
lattice works with groups and subscripts.

Consider the following example,



xx <- seq(1, 10, length=100)
x <- rep(xx, 4)
y <- c(cos(xx), sin(xx), xx, xx^2/10)
fact <- factor(rep(c("cos", "sin", "id", "square"), each=100))
fact2 <- factor(rep(c("periodic", "not periodic"), each=100))

my.df <- data.frame(x=x, y=y, fact = fact, fact2 = fact2)

head(my.df)


myColors <- c(2, 4)

      xyplot(y ~ x | fact,  data = my.df, groups = fact2,
            panel =  panel.superpose,
            panel.groups = function(..., group.number) {

               panel.xyplot(...)
#panel.xyplot( ..., col=myColors[group.number]) #
error

            })


My aim is to assign a custom color to each group, but for some reason the col parameter is already given to panel.xyplot and I can't find where it
gets the values from.

It get's the values from the 'panel.superpose' function, of which
'panel.groups' is an argument. Both the documentation and source code
for 'panel.superpose' should make this clear.

From what I understand, what you want should be as simple as (with a
small correction to your example):


xx <- seq(1, 10, length=100)
x <- rep(xx, 4)
y <- c(cos(xx), sin(xx), xx, xx^2/10)
fact <- factor(rep(c("cos", "sin", "id", "square"), each=100))
fact2 <- factor(rep(c("periodic", "not periodic"), each=200))
my.df <- data.frame(x=x, y=y, fact = fact, fact2 = fact2)

myColors <- c(2, 4)

xyplot(y ~ x | fact, data = my.df, groups = fact2, col = myColors, type = "l")


The use of 'par.settings' is not compulsory, but would help if you
needed to add a legend; e.g.,


xyplot(y ~ x | fact,  data = my.df, groups = fact2, type = "l",
      par.settings = simpleTheme(col = myColors),
      auto.key = list(lines = TRUE, points = FALSE))


If you insist on writing your own panel function, what you need is


xyplot(y ~ x | fact,  data = my.df, groups = fact2,
      panel =  panel.superpose,
      panel.groups = function(..., col.line, type, group.number) {
          panel.xyplot(..., type = "l",
                       col.line = myColors[group.number])
      })


As Bert pointed out, you are responsible for ensuring that argument
names are not repeated by capturing and overriding them.

All of this applies to your second, more complicated, example as well.
As for the order in which the groups are plotted, it is the order of
levels(fact2), which seemed to me the most obvious (or at least the
least surprising) choice. You are free to specify the order when you
create the factor; see ?factor to learn how.

-Deepayan

_____________________________

Baptiste AuguiƩ

School of Physics
University of Exeter
Stocker Road,
Exeter, Devon,
EX4 4QL, UK

Phone: +44 1392 264187

http://newton.ex.ac.uk/research/emag

______________________________________________
R-help@r-project.org 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.

Reply via email to