Dear Baptiste, many thanks, that worked :-)
For the alignment, I made a new minimal example and posted it under the subject "grid.table + splom: how to nicely align panel entries". Cheers, Marius On 2011-04-20, at 10:22 , baptiste auguie wrote: > On 20 April 2011 19:23, Marius Hofert <[email protected]> wrote: >> Dear Baptiste, >> >> thank you for your help. I tried to built in your suggestions into the splom. >> Below is the result. I decided to create the plotmath-expressions outside the >> function splom2, this will allow me later to horizontally shift (via phantom, >> for example) the table entries so that they will be vertically aligned >> according >> to the "=" signs. Although an array is allowed to contain expressions, I >> could >> not manage to create it properly. Do you know a solution? >> >> Cheers, >> >> Marius >> >> library(lattice) >> library(grid) >> library(gridExtra) >> >> ## splom with customized lower.panel >> ## x: data >> ## expr.arr: array of expressions [(i,j,) entry contains expressions which >> are >> ## plotted in a grid table in the lower panel (i,j)] >> splom2 <- function(x, expr.arr){ >> ## function for creating table >> table.fun <- function(vec){ # single values for one panel >> grid.table(vec, >> parse=TRUE, # parse labels as expressions >> theme=theme.list( >> gpar.corefill=gpar(fill=NA, col=NA), # make bg transparent >> core.just="left") # justification of labels >> ) >> } >> ## splom >> splom(x, varname.cex=1.4, >> superpanel=function(z, ...){ >> panel.pairs(z, upper.panel=panel.splom, >> lower.panel=function(i,j){ >> table.fun(expr.arr[i,j,]) >> }, ...) >> }) >> } >> >> ## create data and array of expressions >> d <- 4 >> x <- matrix(runif(d*1000), ncol=d) >> expr.arr <- array(, dim=c(d,d,3), dimnames=c("i","j","val")) # d x d x 3 >> elements >> for(i in 1:d){ >> for(j in 1:d){ >> # expr.arr[i,j,] <- expression(italic(a)==0, italic(bbb)==0, >> italic(c)==0) # does no work >> expr.arr[i,j,] <- c(bquote(italic(a)==.(0)), >> bquote(italic(bbb)==.(0)), bquote(italic(c)==.(0))) # same here >> } >> } >> >> ## plot >> splom2(x, expr.arr) >> > > Initializing your array with a list seems to work for whatever reason > that's well above my head, > > expr.arr <- array(list(NA,NA,NA), dim=c(d,d,3), dimnames=c("i","j","val")) > > As for the alignment, there should be a better way using multiple > columns in grid.table, but parse is struggling to interpret the = sign > on its own. Again, I'm not sure why, this is deep magic to me. > > > library(gridExtra) > d = matrix(c("italic(a)==phantom('')", round(pi,4), > "italic(b)==phantom()", round(pi,6)), ncol=2, byrow=T) > > grid.table(d, parse=T,theme=theme.list( > gpar.corefill=gpar(fill=NA, col=NA), > core.just="left", padding.h = unit(0, "mm") )) > > HTH, > > baptiste > >> >> On 2011-04-20, at 01:33 , baptiste auguie wrote: >> >>> Hi, >>> >>> You may want to wait advice from someone who actually understands (the >>> labyrinth that is) lattice's help for splom, but the following might >>> be a start. I didn't understand what values you actually wanted >>> displayed in the lower triangle panels, so I made up some random ones >>> in a 3x3 matrix of 3-vectors. >>> >>> library(lattice) >>> library(gridExtra) >>> >>> info <- function(x){ >>> grid.table(c(bquote(italic(a)==.(x[1])), >>> bquote(italic(b)==.(x[2])), >>> bquote(italic(c)==.(x[3]))), >>> core.just="left", >>> parse=TRUE) >>> } >>> >>> U <- matrix(runif(3000), ncol=3) >>> >>> splom(U, >>> superpanel=function(z, ...){ >>> ## dummy 3x3 matrix of 3 values to diplay >>> values <- replicate(9, round(rnorm(3), 3), simplify=FALSE) >>> dummy <- matrix(values, ncol=3, byrow=F) >>> panel.pairs(z, upper.panel=panel.splom, >>> lower.panel=function(i, j, ...){ >>> print(paste(i,j)) # current panel indices >>> info(dummy[i,j] [[1]]) # access the list elements >>> }, ...) >>> }) >>> >>> HTH, >>> >>> baptiste >>> >>> >>> On 20 April 2011 10:17, Marius Hofert <[email protected]> wrote: >>>> Dear Baptiste, >>>> >>>> there is one tricky part left: how can I create a matrix with the >>>> grid.table() >>>> objects as output? Is this possible? If not, maybe one can try to work with >>>> panel.splom (which can address single panels and thus call info() for each >>>> row-column index pair (i,j)), but I'm not sure if this will work. >>>> >>>> Cheers, >>>> >>>> Marius >>>> >>>> library(lattice) >>>> library(gridExtra) >>>> >>>> splom2 <- function(x, a, b, c){ >>>> ## function for the additional information >>>> info <- function(a., b., c.){ # single values for one panel >>>> grid.table(c(bquote(italic(a)==.(a.)), >>>> bquote(italic(b)==.(b.)), >>>> bquote(italic(c)==.(c.)) >>>> ), >>>> parse=TRUE, # parse labels as expressions >>>> theme=theme.list( >>>> gpar.corefill=gpar(fill=NA, col=NA), # make bg >>>> transparent >>>> core.just="right") # justification of labels >>>> ) >>>> } >>>> labs <- matrix(, nrow=ncol(x), ncol=ncol(x)) # should be a matrix of >>>> grid.table() objects >>>> for(i in 1:ncol(x)) for(j in 1:ncol(x)) labs[i,j] <- info(a.=a[i,j], >>>> b.=b[i,j], c.=c[i,j]) >>>> ## splom >>>> splom(x, superpanel=function(z,...){ >>>> df=data.frame(rows=as.vector(row(a)), >>>> columns=as.vector(col(a)), labs=as.vector(labs)) >>>> df=subset(df,columns<rows) # subset for lower left triangle >>>> with(df,{ >>>> panel.text(x=rows, y=columns, labels=labs) >>>> }) >>>> panel.pairs(z, upper.panel=panel.splom, >>>> lower.panel=function(...){}, ...) >>>> }) >>>> } >>>> >>>> ## generate data >>>> U <- matrix(runif(3000), ncol=3) >>>> >>>> ## build information >>>> a <- cor(U, method="kendall") >>>> b <- diag(ncol=3, nrow=3) >>>> c <- diag(ncol=3, nrow=3) >>>> >>>> ## plot with information >>>> splom2(U, a, b, c) >>>> >>>> >>>> >> >> ______________________________________________ [email protected] 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.

