[R] help simplifying complex graphic arguments to a function
Michael Friendly
friendly at yorku.ca
Mon Aug 17 21:53:03 CEST 2009
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
More information about the R-help
mailing list