[R] splom, plotmath: how to add three lines of information with alignment?

baptiste auguie baptiste.auguie at googlemail.com
Wed Apr 20 10:22:19 CEST 2011


On 20 April 2011 19:23, Marius Hofert <m_hofert at web.de> 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 <m_hofert at web.de> 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)
>>>
>>>
>>>
>
>



More information about the R-help mailing list