Juan Perez
2016-Aug-12 16:10 UTC
[R] Adding loess lines subsetting to each panel in lattice plot
Hello, I've created an xyplot and I want to add a loess line for x (Age)? <=40 and another for values >40. In a way it is similar to this https://stat.ethz.ch/pipermail/r-help/2009-May/390502.html but still not succcessful. This is my try: xyplot(MOE~Age|Species, groups=Site, ?????? panel = function(x, y, groups=groups,...) { ??????? panel.xyplot(x, y, groups=groups,...) ??? ? ? panel.loess(x,y,subset = x <= 40, col="black") ????????panel.loess(x,y,subset = x >40, col="red")? ????????????? }) When I run the code it "works" but it plots the loess line for all the data, without subsetting.Any suggestion? Thank you [[alternative HTML version deleted]]
Bert Gunter
2016-Aug-12 20:10 UTC
[R] Adding loess lines subsetting to each panel in lattice plot
Try reading ?panel.loess. There is no "subset" argument, so it is of course ignored. -- Bert Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Fri, Aug 12, 2016 at 9:10 AM, Juan Perez via R-help <r-help at r-project.org> wrote:> Hello, I've created an xyplot and I want to add a loess line for x (Age) <=40 and another for values >40. In a way it is similar to this https://stat.ethz.ch/pipermail/r-help/2009-May/390502.html but still not succcessful. > This is my try: > > xyplot(MOE~Age|Species, groups=Site, > panel = function(x, y, groups=groups,...) { > panel.xyplot(x, y, groups=groups,...) > panel.loess(x,y,subset = x <= 40, col="black") panel.loess(x,y,subset = x >40, col="red") > }) > When I run the code it "works" but it plots the loess line for all the data, without subsetting.Any suggestion? > Thank you > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.
Juan Perez
2016-Aug-13 13:31 UTC
[R] Adding loess lines subsetting to each panel in lattice plot
Thanks Bert I am not sure what you meant by reading though. I managed to sort this out, although ideally would exist a better solution. I have created a column in my dataset, and given two codes depending whether older or younger than 40. Afterwards I have applied xyplot(MOE~Age|Species, groups=Old, ?????? panel= function(x,y,...){? ## custom panel function to add an overall loess line ???????? panel.superpose(x,y,...) ???????? panel.loess(x,y,col="black",lwd=2,...) ?????? }, ?????? panel.groups = function(x,y,...){ ???????? panel.xyplot(x,y,...) ???????? panel.loess(x,y,...) ?????? }) This gives a loess line for data younger than 40, another for the ones older, and a third one for all the data. I hope this helps to someone else. Unfortunately, the dataset needs to be modified everytime we want to make a new or different subset. Best regards El Viernes 12 de agosto de 2016 21:10, Bert Gunter <bgunter.4567 at gmail.com> escribi?: Try reading ?panel.loess. There is no "subset" argument, so it is of course ignored. -- Bert Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Fri, Aug 12, 2016 at 9:10 AM, Juan Perez via R-help <r-help at r-project.org> wrote:> Hello, I've created an xyplot and I want to add a loess line for x (Age)? <=40 and another for values >40. In a way it is similar to this https://stat.ethz.ch/pipermail/r-help/2009-May/390502.html but still not succcessful. > This is my try: > > xyplot(MOE~Age|Species, groups=Site, >? ? ? ? panel = function(x, y, groups=groups,...) { >? ? ? ? panel.xyplot(x, y, groups=groups,...) >? ? ? ? panel.loess(x,y,subset = x <= 40, col="black")? ? ? ? panel.loess(x,y,subset = x >40, col="red") >? ? ? ? ? ? ? }) > When I run the code it "works" but it plots the loess line for all the data, without subsetting.Any suggestion? > Thank you > >? ? ? ? [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > 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.[[alternative HTML version deleted]]
Bert Gunter
2016-Aug-14 11:29 UTC
[R] Adding loess lines subsetting to each panel in lattice plot
Juan: What I gave you previously was correct, but not "nice". The subscripts = TRUE argument should have been in the xyplot() call, not the pnl function. However, it is actually not explicitly needed there either, because it will default to TRUE if the panel function has a subscripts argument, which it does (and did -- that's why it worked before). Here is the more sensible version (cc'ed to the list, which I fortunately failed to do before): ## set up example x <- runif(100) y <- rnorm(100) fac <- rep(LETTERS[1:4], e= 25) age <- sample(1:2,50,rep=TRUE) x <- runif(100) y <- rnorm(100) fac <- rep(LETTERS[1:4], e= 25) age <- runif(100,20,60) #panel function pnl <- function(x, y, age, subscripts, ...){ age <- age[subscripts] old <- age<=40 panel.xyplot(x,y,...) panel.loess(x,y,col.line = "green") panel.loess(x[old],y[old],col.line = "red") panel.loess(x[!old],y[!old],col.line = "blue") } xyplot(y~x|fac, age=age, panel=pnl, lay=c(2,2)) Note that my prior comments about moviing the creation of the groups to the panel function instead of the data still hold, of course. Cheers, Bert Bert Gunter "The trouble with having an open mind is that people keep coming along and sticking things into it." -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) On Sat, Aug 13, 2016 at 7:49 AM, Bert Gunter <bgunter.4567 at gmail.com> wrote:> Inline. > > -- Bert > > > > On Sat, Aug 13, 2016 at 6:31 AM, Juan Perez <beire55 at yahoo.es> wrote: >> Thanks Bert >> >> I am not sure what you meant by reading though. >> >> I managed to sort this out, although ideally would exist a better solution. >> I have created a column in my dataset, and given two codes depending whether >> older or younger than 40. Afterwards I have applied >> >> xyplot(MOE~Age|Species, groups=Old, >> panel= function(x,y,...){ ## custom panel function to add an overall >> loess line >> panel.superpose(x,y,...) >> panel.loess(x,y,col="black",lwd=2,...) >> }, >> panel.groups = function(x,y,...){ >> panel.xyplot(x,y,...) >> panel.loess(x,y,...) >> }) >> >> This gives a loess line for data younger than 40, another for the ones >> older, and a third one for all the data. I hope this helps to someone else. >> Unfortunately, the dataset needs to be modified everytime we want to make a >> new or different subset. > > Not true. Creating a grouping factor and using panel.groups is > certainly one way to do it, but it's not the only way. You could > alternatively create the groups in the panel function by using the > 'subscripts' argument, something like: > > x <- runif(100) > y <- rnorm(100) > fac <- rep(LETTERS[1:4], e= 25) > age <- runif(100,20,60) > pnl <- function(x,y,age, subscripts=TRUE,...){ > age <- age[subscripts] > old <- age<=40 > panel.xyplot(x,y,...) > panel.loess(x,y,col.line = "black") > panel.loess(x[old],y[old],col.line = "red") > panel.loess(x[!old],y[!old],col.line = "green") > } > > xyplot(y~x| fac, panel = pnl, age=age,lay=c(2,2)) > > Cheers, > Bert > >> >> Best regards >> >> >> El Viernes 12 de agosto de 2016 21:10, Bert Gunter <bgunter.4567 at gmail.com> >> escribi?: >> >> >> Try reading ?panel.loess. There is no "subset" argument, so it is of >> course ignored. >> >> -- Bert >> >> >> >> Bert Gunter >> >> "The trouble with having an open mind is that people keep coming along >> and sticking things into it." >> -- Opus (aka Berkeley Breathed in his "Bloom County" comic strip ) >> >> >> On Fri, Aug 12, 2016 at 9:10 AM, Juan Perez via R-help >> <r-help at r-project.org> wrote: >>> Hello, I've created an xyplot and I want to add a loess line for x (Age) >>> <=40 and another for values >40. In a way it is similar to this >>> https://stat.ethz.ch/pipermail/r-help/2009-May/390502.html but still not >>> succcessful. >>> This is my try: >>> >>> xyplot(MOE~Age|Species, groups=Site, >>> panel = function(x, y, groups=groups,...) { >>> panel.xyplot(x, y, groups=groups,...) >>> panel.loess(x,y,subset = x <= 40, col="black") >>> panel.loess(x,y,subset = x >40, col="red") >>> }) >>> When I run the code it "works" but it plots the loess line for all the >>> data, without subsetting.Any suggestion? >>> Thank you >>> >>> [[alternative HTML version deleted]] >>> >>> ______________________________________________ >>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see >>> 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. >> >>