I'm working on a package to produce graphic displays of 2- and 3-way tables
and need some help/advice on how to simplify the specification of a complex
argument that gives the drawing details for each cell of the table.
Prototypes of two functions, 'tableplot' and 'cellgram' are given below.

The essential idea is that for a given table ('values'), the cells can be
be of different 'types' (integers: 1, 2, ..., max(types)).  An argument
'patterns' is a list of max(types) lists, where patterns[[k]] is presently
a list of 10 graphic parameters specifying shapes, colors, fill, background color,
etc. that are passed as arguments to the cellgram function.

The difficulty is that it's too hard to remember the order and meaning
of the cellgram arguments to be passed in the patterns argument to tableplot,
and often quite a few of these will take their default values, but-- as
presently written-- all must be specified.

The actual implementation of these functions use grid graphics, and I know
from other grid-based packages that use named specifications like

gp = gpar(shape=1, shape.col="black", shape.lty=2, ...)

are commonly used, but I'm unable to see how to re-write these functions to
take advantage of that form.  To be specific, I need to re-write cellgram
to take two arguments

cellgram(cell.values, cell.pattern)

and then be able to extract the current arguments from cell.pattern within
this function.


tableplot <- function(

values, # Matrix of values to plot; can be a matrix, or an array of 3 dimensions. types, # Matrix of pattern designations (i.e., what pattern for each cell).
#    patterns,             # List of lists; each list specifies one pattern.
patterns = list(list(0, "black", 1, "white", "white", 0, 0.5, "grey80", "no", 1)),
   ...){

#
   #---Draw cellgrams.

   for (i in 1:dim(values)[1]){
       for (j in 1:dim(values)[2]){

           pattern = patterns[[types[i,j]]]
           cellgram(cell       = values[i,j,],
                  shape      = pattern[[1]],
                  shape.col = pattern[[2]],
                  shape.lty = pattern[[3]],
                  cell.fill = pattern[[4]],
                  back.fill = pattern[[5]],
                  label     = pattern[[6]],
                  label.size= pattern[[7]],
                  ref.col     = pattern[[8]],
                  ref.grid     = pattern[[9]],
                  scale.max = pattern[[10]]
                  )
           }
       }

}

cellgram = function(

   #-- Arguments that may be vectorized:

   cell,                   #-- cell value(s)
shape=0, #-- shape of cell value(s); 0=circle, 1=diamond, 2=square, 3=cross
   shape.col="black", #-- color of shape(s), outline only
   shape.lty=1,         #-- line type used for shape(s)

   #-- Arguments that can not be vectorized:

scale.max=1, shape.lwd=1, #-- line width of shape(s)
   cell.fill="white", #-- inside color of smallest shape in a cell
   back.fill="white", #-- background color of cell
   label=0,           #-- how many cell values will be printed; max is 4
   label.size=0.7,    #-- size of text labels
   ref.col="grey80",  #-- color for ref lines
   ref.grid=TRUE,     #-- to draw ref lines or not
   neg.col="white",   #-- fill color for negative cell value
   frame.col="black", #-- color of frame around cell
   frame.lwd="0.5"    #-- line width of frame around cell
   t.col="black",     #-- color of cell labels  [[ should be: label.col]]
   )
{
# ...
}


--
Michael Friendly Email: friendly AT yorku DOT ca Professor, Psychology Dept.
York University      Voice: 416 736-5115 x66249 Fax: 416 736-5814
4700 Keele Street    http://www.math.yorku.ca/SCS/friendly.html
Toronto, ONT  M3J 1P3 CANADA

______________________________________________
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.

Reply via email to