Michael Friendly
2001-Nov-30 21:56 UTC
[R] mosaic.by(): vectorizing args passed by apply()?
I've just started learning R, so I'm still on the steep part of the learning curve, but my enthusiasm was heightened by learning that there's a very nice implementation of mosaicplot(). As a learning project, I've already done a basic implementation of a pairs.table() function which does a mosaic scatterplot matrix, and now I'm trying to do conditional mosaic plots (discrete analog of a coplot). I found that apply(table, by, mosaicplot,...) worked quite nicely, but I want to label each mosaic with the combination of the factor name and level value, e.g., Sex: Male, and I can't figure out how to get just one element of a list passed by apply as an argument. In the function below, titles is a list like:> paste("Sex: ", dimnames(Titanic)[[2]])[1] "Sex: Male" "Sex: Female" and I want each element passed as the main= value for the corresponding slice of the table. Can someone help? Try the function below with data(HairEyeColor) mosaic.by(HairEyeColor, 3) ## Conditional mosaics, one for each level of the by-variable(s) ## -- how to add factor levels as main= ? ## -- how to do for more than one by-variable? mosaic.by <- function(table, by=NULL, ...) { n <- length(dim(table)) if(n == 0) stop("invalid table `table'") if(length(by)>1) stop("Sorry, cannot handle >1 by variable yet.") np <- dim(table)[by] name <- names(dimnames(table))[by] titles <- paste(name, ":", dimnames(table)[[by]]) opar <- par( mfrow=c(np, np), usr=c(1,1000,1,1000), mar=rep(1/2,4)) on.exit(par(opar)) apply(table, by, mosaicplot, main=titles, shade=T, legend=F, ...) } thx, -Michael -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
Dear Mike, There might be a more elegant solution, but one way is slice the table into a list of tables corresponding to the panels of the display, and to use a for loop to index panels and titles: mosaic.by <- function(table, by=NULL, ...) { n <- length(dim(table)) if(n == 0) stop("invalid table `table'") if(length(by)>1) stop("Sorry, cannot handle >1 by variable yet.") np <- dim(table)[by] name <- names(dimnames(table))[by] titles <- paste(name, ":", dimnames(table)[[by]]) opar <- par( mfrow=c(np, np), usr=c(1,1000,1,1000), mar=rep(1,4)) # why np x np? on.exit(par(opar)) panels <- apply(table, by, list) for (i in 1:np) mosaicplot(panels[[i]][[1]], main=titles[i], shade=T, ...) } Does that do what you want? Regards, John At 04:56 PM 11/30/2001 -0500, Michael Friendly wrote:>I've just started learning R, so I'm still on the steep part of the >learning curve, but my enthusiasm was heightened by learning that >there's a very nice implementation of mosaicplot(). > >As a learning project, I've already done a basic implementation >of a pairs.table() function which does a mosaic scatterplot matrix, >and now I'm trying to do conditional mosaic plots (discrete analog >of a coplot). > >I found that > apply(table, by, mosaicplot,...) >worked quite nicely, but I want to label each mosaic with the >combination of the factor name and level value, e.g., Sex: Male, >and I can't figure out how to get just one element of a list >passed by apply as an argument. > >In the function below, titles is a list like: > > paste("Sex: ", dimnames(Titanic)[[2]]) >[1] "Sex: Male" "Sex: Female" >and I want each element passed as the main= value for the corresponding >slice of the table. >Can someone help? > >Try the function below with > >data(HairEyeColor) >mosaic.by(HairEyeColor, 3) > >## Conditional mosaics, one for each level of the by-variable(s) >## -- how to add factor levels as main= ? >## -- how to do for more than one by-variable? >mosaic.by <- >function(table, by=NULL, ...) >{ > n <- length(dim(table)) > if(n == 0) > stop("invalid table `table'") > if(length(by)>1) > stop("Sorry, cannot handle >1 by variable yet.") > > np <- dim(table)[by] > name <- names(dimnames(table))[by] > titles <- paste(name, ":", dimnames(table)[[by]]) > > opar <- par( mfrow=c(np, np), usr=c(1,1000,1,1000), mar=rep(1/2,4)) > on.exit(par(opar)) > > apply(table, by, mosaicplot, main=titles, shade=T, legend=F, ...) >} > >thx, >-Michael >-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- >r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html >Send "info", "help", or "[un]subscribe" >(in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch >_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._----------------------------------------------------- John Fox Department of Sociology McMaster University Hamilton, Ontario, Canada L8S 4M4 email: jfox at mcmaster.ca phone: 905-525-9140x23604 web: www.socsci.mcmaster.ca/jfox ----------------------------------------------------- -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._