File: doubledeckerplot.R

package info (click to toggle)
r-cran-vcd 1%3A1.4-4-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 2,256 kB
  • sloc: sh: 11; makefile: 5
file content (87 lines) | stat: -rwxr-xr-x 2,875 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#######################################
### doubledecker plot

doubledecker <- function(x, ...)
  UseMethod("doubledecker")

doubledecker.formula <-
function(formula, data = NULL, ..., main = NULL)
{
    if (is.logical(main) && main)
      main <- deparse(substitute(data))

    if (is.structable(data))
      data <- as.table(data)

    m <- match.call(expand.dots = FALSE)
    edata <- eval(m$data, parent.frame())

    fstr <- strsplit(paste(deparse(formula), collapse = ""), "~")
    vars <- strsplit(strsplit(gsub(" ", "", fstr[[1]][2]), "\\|")[[1]], "\\+")
    dep <- gsub(" ", "", fstr[[1]][1])
    varnames <- vars[[1]]
    if (dep == "")
      stop("Need a dependent variable!")
    varnames <- c(varnames, dep)

    if(inherits(edata, "ftable")
       || inherits(edata, "table")
       || length(dim(edata)) > 2) {
        dat <- as.table(data)
        if(all(varnames != ".")) {

          ind <- match(varnames, names(dimnames(dat)))
          if (any(is.na(ind)))
            stop(paste("Can't find", paste(varnames[is.na(ind)], collapse=" / "), "in", deparse(substitute(data))))

          dat <- margin.table(dat, ind)
        } else {
          ind <- match(dep, names(dimnames(dat)))
          if (is.na(ind))
            stop(paste("Can't find", dep, "in", deparse(substitute(data))))
          dat <- aperm(dat, c(seq_along(dim(dat))[-ind], ind))
        }
        doubledecker.default(dat, main = main, ...)
      } else {
        tab <- if ("Freq" %in% colnames(data))
          xtabs(formula(paste("Freq~", varnames, collapse = "+")),
                data = data)
        else
          xtabs(formula(paste("~", varnames, collapse = "+")),
                data = data)

        doubledecker.default(tab, main = main, ...)
      }
  }

doubledecker.default <- function(x,
                         depvar = length(dim(x)),
                         margins = c(1, 4, length(dim(x)) + 1, 1),
                         gp = gpar(fill = rev(gray.colors(tail(dim(x), 1)))),
                         labeling = labeling_doubledecker,
                         spacing = spacing_highlighting,
                         main = NULL,
                         keep_aspect_ratio = FALSE,
                         ...) {
  x <- as.table(x)
  d <- dim(x)
  l <- length(d)
  if (is.character(depvar))
    depvar <- match(depvar, names(dimnames(x)))
  condvars <- (1:l)[-depvar]
  x <- aperm(x, c(condvars, depvar))
  strucplot(x,
            core = struc_mosaic(zero_split = FALSE, zero_shade = FALSE),
            condvars = l - 1,
            spacing = spacing,
            split_vertical = c(rep.int(TRUE, l - 1), FALSE),
            gp = gp,
            shade = TRUE,
            labeling = labeling,
            main = main,
            margins = margins,
            legend = NULL,
            keep_aspect_ratio = keep_aspect_ratio,
            ...
            )
}