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.