User defined panel functions in lattice
On Fri, Apr 20, 2012 at 8:15 PM, David Winsemius <dwinsemius at comcast.net> wrote:
Another puzzle. In the original posting there was this segment: --- but gives an error message without par.settings if i want to add ? ? ? ? ? ? ? ? ? ? ? panel.Locfit(x,y,nn= 0.9,lwd = c(1,2,3), ...) Error using packet 1 formal argument "Iwd" matched by multiple actual arguments --- On my mailer that formal argument starts with a capital "I" but the code seemed to be attempting a lowercase "l". I could never see reason offered for defining a new panel.locfit, but I'm wondering if the sometimes similar representation of those two different letters could be causing an obscure conflict?
If that is indeed what's happening, it will be the first time for me.
My mailer shows upper case "L" too, I assume that this is correct and
the OP's intention is exactly that - not redefine panel.locfit but
create his own (if that is good use of his/our time is another matter
altogether). Seems to me the source of this error was, as the error
message suggested, simply the "default" formals:
panel.Locfit <-
function(x,y, nn, h, col, col.line, lwd = lwd, lty = lty, ...){
...
}
Which is why this solved it:
xyplot(y ~x,xx,
groups = Farm,
auto.key=TRUE,lwd=1:3,
panel = panel.superpose,panel.groups=function(x,y,nn,...){
panel.Locfit(x,y,nn=.9,...)
panel.xyplot(x,y,...)
}
)
With my new found understanding of the OP's real intentions, maybe a
call to trellis.par.get('superpose.line') inside panel.Locfit is the
answer?
Cheers
-- David.
Cheers
?panel.Locfit
No documentation for ?panel.Locfit? in specified packages and libraries: you could try ???panel.Locfit?
?panel.locfit
{locfit} ? ? ? ?R Documentation
Locfit panel function
Description
This panel function can be used to add locfit fits to plots generated by
trellis.
I am trying to construct a function/s to cover as many of the normal situations as possible. Usually I have to amend colours lines etc to distinguish the data. I want to cover a number of situations 1 Conditioned by panel no groups 2 Conditioned by panel and groups. 3 Multiple values for above - to show colleagues (EDA) 4 Conditioned by panel and groups + an overall fit for all the data within a panel 5 Several y values in a panel eg Y1+Y2 and outer = FALSE with a fit for each of Y1 and Y2 I am trying to cover as many of the above situations in 1 function before resulting to trellis.focus or overlaying. The graphs that I normally create are not simple, generally involving useOuterStrips which may have different y scales for panel rows (combindeLimits/manual) and different panel row heights. locfit is like loess but 2 arguments for smoothing; the degree of smoothing produced by the defaults is approximately that of loess but I normally need less smoothing (the same would be apply for loess). Most of the questions to Rhelp are for 1 with just a small number for 5 and they are not applicable here and understanding the requirements for passing arguments in these different situations I find difficult. I would like to reduce the number of panel functions to the minimum to cover the general situaltions because my graphs are usually not normal and then add to them for a particular situation. Regards Duncan At 01:38 21/04/2012, you wrote:
Duncan,
First off, I admit it is not clear to me what you are trying to
achieve and more importantly, why? by "why" I mean 1) I don't see the
advantage of writing one general panel function for completely
different situations (one/multiple smoothers, grouping levels etc.) 2)
your intended result as I understand it seems rather cluttered, google
<chartjunk>. 3) I am unfamiliar with locfit package, but are we
reinventing the wheel here ? i.e. will modifying settings in xyplot(y
~x, xx, groups = Farm, type=c('p','smooth')) achieve the same ?
With your initial reproducible example (thank you) it was easy to
eliminate the errors, but clearly the resulting plots are not what you
intended (continue inline):
On Thu, Apr 19, 2012 at 4:23 PM, Duncan Mackay <mackay at northnet.com.au>
wrote:
<snip>
3. What I want to be able to add in the above is extra lines with different values of nn. ?I think I will have to modify panel.Locfit so that it goes through different values of nn in each of the panels and groups if I want different colours for extra lines with different nn values
Yes you could. There are several options:
add group.number to the arguments of panel.locfit and use it to make
nn a vector, along the lines of
?panel.foo <- function(x,y,group.number,theta,...){
? ?smpar <- theta[group.number]
? ?panel.loess(x,y,smpar,...)
? ?panel.xyplot(x,y,...)
?}
xyplot(y~x,xx,group=Farm,theta=c(4,1,.4),panel=panel.superpose,panel.groups=panel.foo)
# or
xyplot(y~x|Farm,xx,group=Padd,theta=c(.6,1),
?panel=panel.superpose,panel.groups=panel.foo)
Here you will need to modify the Farm group to 6 levels - 3*two
smoothers.
You could make nn a list and loop over it inside the panel function.
Looks like you tried something like that with specifying 2
panel.Locfit, one suggestion to your code:
? ? ? ? ? ? ? ? ? panel.Locfit(x,y,...) # default 0.7
? ? ? ? ? ? ? ? ? ? ?panel.Locfit(x,y,nn=0.9) ? # i.e. remove the
... to avoid clashes
Finally, use ?trellis.focus to plot the second smoother "post-hoc".
also the latticeExtra package has many useful tools to create layers
of the same (or different) plot with different settings.
4 Produce an extra line for a fit for all the groups in 1/2+ panels. ?As for 3 but I do not know how to group all the x and y's ?for each of the panes using panel.groups
Why does it matter ? seems you have failed to learn the lesson from the first post - the same functionality applies to 1 as to multiple panels. Does each panel have a different grouping structure ? use packet.number() for panels similar to group.number idea.
I need to do this and then scale up for a panel function to include confidence bands
than expand the xlim,ylim or scales in ?xyplot
For the record making Farm and Padd factors. With 1 panel and groups = Farm works with the extra line the same colour for its group a similar situation for the three panels when conditioned by Farm and groups = Pad
???? Like I said I am a little lost on this problem but I hope this helps giving some direction. Cheers
?xyplot(y ~x, xx,
? ? ? ?groups = Farm,
? ? ? ?par.settings = list(strip.background = list(col =
"transparent"),
? ? ? ? ? ? ? ? ? ? ? ? ? ?superpose.line ? = list(col =
c("black","grey"),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?lwd =
c(1,2,3),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?lty =
c(2,1,3)),
? ? ? ? ? ? ? ? ? ? ? ? ? ?superpose.symbol = list(cex = c(0.8,
0.7,0.7),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?col =
c("red","black","blue"),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?pch = c(20,4,16))
? ? ? ? ? ? ? ? ?),
? ? ? ?auto.key=list(lines=T,points = T,rectangles=F),
? ? ? ?panel ?= panel.superpose,
? ? ? ?panel.groups=function(x,y, ...){
? ? ? ? ? ? ? ? ? ? ? panel.xyplot(x,y,...)
? ? ? ? ? ? ? ? ? ? ? panel.Locfit(x,y,...) # default 0.7
? ? ? ? ? ? ? ? ? ? ? panel.Locfit(x,y,nn=0.9,...)
? ? ? ? ? ? ? ? ? ? }
?) ## xyplot
Regards
Duncan
At 02:12 20/04/2012, you wrote:
On Thu, Apr 19, 2012 at 2:30 AM, Duncan Mackay <mackay at northnet.com.au> wrote:
Hi
?xyplot(y ~x|Farm,xx,
? ? ? ?groups = Padd,
? ? ? ?panel = panel.superpose,
? ? ? ?panel.groups=function(x,y, ...){
? ? ? ? ? ? ? ? ? ? ? panel.Locfit(x,y,...)
? ? ? ? ? ? ? ? ? ? ? panel.xyplot(x,y,...)
? ? ? ? ? ? ? ? ? ? }
?) ## xyplot
The above works nicely and also without par.setting giving lattice
defaults.
The par.setting is handy for a lot of graphs that I do.
But when I tried a 1 panel plot I get the error message.
?xyplot(y ~x,xx,
? ? ? ?groups = Farm,
? ? ? ?auto.key=TRUE,
? ? ? ?panel = function(x,y, ...){
? ? ? ? ? ? ? ? ? ? ? panel.Locfit(x,y,...)
? ? ? ? ? ? ? ? ? ? ? panel.xyplot(x,y,...)
? ? ? ? ? ? ? ? ? ? }
? ? ? ?)
These two plots are NOT THE SAME. Did you want the same as the first
but with groups being Farm and Padd ignored ? in that case you
(again)
need a panel.groups:
?xyplot(y ~x,xx,
? ? ?groups = Farm,
? ? ?auto.key=TRUE,
? ? ?panel = panel.superpose,panel.groups=function(x,y,...){
? ? ? ? ? ? ? ? ? ? panel.Locfit(x,y,...)
? ? ? ? ? ? ? ? ? ? panel.xyplot(x,y,...)
? ? ? ? ? ? ? ? ? }
? ? ?)
If I want to plot another curve with different smoothing but gives an error message without par.settings if i want to add ? ? ? ? ? ? ? ? ? ? ? panel.Locfit(x,y,nn= 0.9,lwd = c(1,2,3), ...) Error using packet 1 formal argument "Iwd" matched by multiple actual arguments
It is all in the way you initially specified how to pass the
arguments
for panel.Locfit. This works without error:
?xyplot(y ~x,xx,
? ? ?groups = Farm,
? ? ?auto.key=TRUE,lwd=1:3,
? ? ?panel = panel.superpose,panel.groups=function(x,y,nn,...){
? ? ? ? ? ? ? ? ? ? panel.Locfit(x,y,nn=.9,...)
? ? ? ? ? ? ? ? ? ? panel.xyplot(x,y,...)
? ? ? ? ? ? ? ? ? }
? ? ?)
HTH
I also need to plot a smoothed line for all groups trying groups, subscripts and panel.groups as arguments without success Any solutions to solve the above will be gratefully received and faithfully applied. Duncan sessionInfo() R version 2.15.0 (2012-03-30) Platform: i386-pc-mingw32/i386 (32-bit) locale: [1] LC_COLLATE=English_Australia.1252 ?LC_CTYPE=English_Australia.1252 LC_MONETARY=English_Australia.1252 LC_NUMERIC=C LC_TIME=English_Australia.1252 attached base packages: [1] datasets ?utils ? ? stats ? ? graphics ?grDevices grid ?methods base other attached packages: [1] locfit_1.5-7 ? ? ? ?R.oo_1.9.3 ? ? ? ? ?R.methodsS3_1.2.2 foreign_0.8-49 ? ? chron_2.3-42 ? ? ? ?MASS_7.3-17 latticeExtra_0.6-19 RColorBrewer_1.0-5 [9] lattice_0.20-6 loaded via a namespace (and not attached): [1] tools_2.15.0
David Winsemius, MD West Hartford, CT
______________________________________________ R-help at 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.
David Winsemius, MD West Hartford, CT