On 10/2/07, GOUACHE David <[EMAIL PROTECTED]> wrote: > Hello, > > I'm trying to pull off a certain graph using splom, and can't quite get my > panel functions right. > Basically, the equivalent using pairs would be something like this (using > iris data set as an example): > > panel.corval <- function(x, y, digits=2, prefix="", cex.cor,col,pch) > { > usr <- par("usr"); on.exit(par(usr)) > par(usr = c(0, 1, 0, 1)) > r <- abs(cor(x, y,use="complete.obs")) > txt <- format(c(r, 0.123456789), digits=digits)[1] > txt <- paste(prefix, txt, sep="") > if(missing(cex.cor)) cex <- 0.8/strwidth(txt) > text(0.5, 0.5, txt, cex = cex ) > } > pairs(iris[,1:4], lower.panel=panel.smooth, > upper.panel=panel.corval,col=rainbow(nlevels(iris$Species))[iris$Species],pch=19)
Here's a more or less direct translation: panel.corval2 <- function(x, y, digits=2, prefix="", cex.cor, ...) { require(grid) r <- abs(cor(x, y, use = "complete.obs")) txt <- format(c(r, 0.123456789), digits=digits)[1] txt <- paste(prefix, txt, sep="") if (missing(cex.cor)) cex.cor <- 10 / nchar(txt) grid.text(txt, 0.5, 0.5, gp = gpar(cex = cex.cor)) } splom(iris[1:4], groups = iris$Species, pch = 16, lower.panel = function(...) { panel.xyplot(...) panel.loess(..., col = 1, lwd = 3) }, upper.panel = panel.corval2) > My goals are: > 1) to have in one panel (above or below the diagonal) the points themselves > with a smoothing line over all the points and in the other the (absolute) > value of the correlation coefficient, so as to get an overall idea of my > correlations > 2) to be able to identify points depending on levels of one or more factors > (hence the groups argument that is giving me a hard time in writing a > succesfull panel function) > 3) I want to do this in splom as I want to build several scatterplot > matrices subsetting my data over the levels of another factor... > > Could anyone please help me out with this ? > > Also, while trying to set up an example, I landed upon this behavior I > couldn't quite make sense of: > > panel.corval <- function(x, y, digits=2, prefix="", cex.cor) > { > usr <- par("usr"); on.exit(par(usr)) > par(usr = c(0, 1, 0, 1)) > r <- abs(cor(x, y,use="complete.obs")) > txt <- format(c(r, 0.123456789), digits=digits)[1] > txt <- paste(prefix, txt, sep="") > if(missing(cex.cor)) cex <- 0.8/strwidth(txt) > text(0.5, 0.5, txt, cex = cex ) > } > pairs(iris[,1:4], lower.panel=panel.smooth, > upper.panel=panel.corval,col=rainbow(nlevels(iris$Species))[iris$Species],pch=19) > > Erreur dans lower.panel(...) : unused argument(s) (col = c("#FF0000", > "#FF0000", "#FF0000", > > I can't understand why not specifying col and pch arguments in the function > I use for upper.panel (which dosen't at all need them in this case) is a > problem. upper.panel will be called with pch, col, etc., even if they don't ``need'' them. Having a ... argument should be enough to capture these. > It's all the more confusing that the error message says the problem > is with lower.panel... If anyone has a clue as to what's happening, please > tell. pairs.default is renaming things internally; hint: try pairs(iris[,1:4], upper.panel=panel.corval,pch=19, row1attop=FALSE) -Deepayan ______________________________________________ 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.